• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    ALMADDocker a kontejnery
    Docker aneb přístupný provoz kontejnerizovaných aplikací
    Docker(Hub), Compose, Swarm, boot2docker, DevOps, LXC, ECS, TumTum a jiné buzzwordy
    Bezpečnost v prostředí kontejnerů
    Related: automatizace [ Centralizovaná správa stanic a ostatních prvků v síti konfigurace/inventarizace/instalace/aktualizace/zalohovani ]
    rozbalit záhlaví
    INDIAN
    INDIAN --- ---
    INDIAN: samozrejme ze se snazim podojit kozla s necim jako bootfile-name (facepalm) ... aneb kdyz se nekdo snazi pracovat s kontejnerama jako s VM (2xfacepalm)

    (reseni bez nutnosti pouziti DHCP nalezeno, takze sem to tu jen zbytecne zaplacal)
    RUDOLF
    RUDOLF --- ---
    INDIAN: nemám osobní zkušenost + otázka jestli jsem dobře porozuměl zadání. Jen jsem si přečetl dva texty. Přijde mi že ipam out of box neumí komunikovat s externím DHCP serverem.. Externí DHCP server řeší https://gist.github.com/nerdalert/3d2b891d41e0fa8d688c

    A tady text který mě tam navedl: http://hicu.be/docker-dhcp
    INDIAN
    INDIAN --- ---
    mam trochu specifickej pripad, potreboval bych radu ohledne macvlan kdy by nekdo vedel...

    snazim se dostat par kontejneru explicitne na do LAN... hlavne teda potrebuju aby si vyzadaly z lokalniho DHCP serveru IP, na kterym uz je ceka dle preddefinovanych MAC adres dany IP s konfiguraci (duvodem je jim injektovat konfiguraci pomoci bootfile-name).

    docker-compose.yml
    version: "2"
    
    services:
    
      ceoslab0:
        container_name: ceoslab0
        image: gitlab-registry.acme.com/network/arista-containers/ceosimage:latest
        privileged: true
        mac_address: "02:42:ac:1f:ee:00"
        networks:
          front:
    
      ceoslab1:
        container_name: ceoslab1
        image: gitlab-registry.acme.com/network/arista-containers/ceosimage:latest
        privileged: true
        mac_address: "02:42:ac:1f:ee:01"
        networks:
          front:
    
    
    networks:
      front:
        driver: macvlan
        driver_opts:
         parent: eth0
        ipam:
          config:
            - subnet: 172.16.96.0/23
              gateway: 172.16.96.1
              ip_range: 172.16.97.176/28
              aux_addresses: 
                router: 172.16.97.190
    

    A pak mu vytvorim interface:
    ip link add ceoslab link eth0 type macvlan mode bridge
    ip addr add 172.16.97.190/23 dev ceoslab
    ip link set ceoslab up
    ip route add 172.16.97.176/28 dev ceoslab 
    


    pri startu se ale na ten dhcp server venku vubec nedostane (pouze prideli nahodne adresu z uvedenyho intervalu):
    # docker exec -it ceoslab0 ip r
    default via 172.16.96.1 dev eth0 
    blackhole 127.0.0.0/8 proto gated scope nowhere 
    127.0.0.1 dev lo proto gated scope link src 127.0.0.1 
    172.16.96.0/23 dev eth0 proto kernel scope link src 172.16.97.185
    


    neresil nekdo neco podobnyho uz?
    HOUMLES
    HOUMLES --- ---
    nema nekdo zkusenost jak updatnout rucne vnitrni dns na swarmu? potreboval bych z nej smazat jeden zaznam, kterej patri sluzbe, ktera uz nebezi, ale balancer mi na ni porad preskakuje.
    nevim jak se mi to povedlo, ale je tam a musim za ho zbavit.
    bohuzel nemam moznost to cely resetovat a znovu spustit coz je mi jasny, ze by pomohlo.
    MLEKAR_STEIN
    MLEKAR_STEIN --- ---
    SPACEANGEL:
    jak pise MARTEN, extra hosts...

    mam to v praci, protoze je pozadavek mit db "na železe" aby byla db "stejně jako na produkci".

    v compose to je pro
    services:
        servicename:
            extra_hosts:
                - "jmenoserveru:10.20.30.40"
            hromadadlasichparametru....
    

    pro samotny docker parametr:
    --add-host [Hostname]:[IPAddress]
    
    MARTEN
    MARTEN --- ---
    SPACEANGEL: moznosti by bylo vic. docke ma virtualni sitovku, lze se tedy pripojovat pres ip hosta (v configu daemona), nebo pridat additional hosts a delat to pak pres name.
    pripadne by mohlo jit zmenit network na host.
    nebo asi skoro nejlepe rozbehnout mysql taky v dockeru. kdyz uz v nem bezi zbytek, pro neco mit mimo nej.
    SH_PANDA
    SH_PANDA --- ---
    SPACEANGEL: asi mam lepsi google fu. Nezkousel jsem, ale tohle vypada jako to co hledas https://forums.docker.com/t/accessing-host-machine-from-within-docker-container/14248
    SPACEANGEL
    SPACEANGEL --- ---
    ahoj, debilni dotaz, ale je mozny nejakej port v kontejneru presmerovat ven na hosta (proste obracene)?

    Konkretni situace: na hostitelskem pocitaci bezi mysql, a nekolik kontejneru s php. A me jde o to, aby skripty v tom kontejneru proste se pripojovali na localhost:1234 (cislo portu libivolne) a to bylo protunelovany na 3306 na tom hostilteskem.

    Jo, zkousel jsem googlit, ale moc jsem toho nevygooglil a jsem z toho takovej nemoudrej :)
    MISO
    MISO --- ---
    JON: ahoj, je to skutocne tak, jak vravis, vlastnik musi byt nastaveny na root:root. Skusal som i ine distra, tam sa to chovalo rovnako, tzn. nefungovalo. Dakujem tebe i ostatnym za vas cas.

    Riesenie pre docker compose je vlastny Dockerfile, kde sa spravne nastavia permissions.
    
    FROM alpine:latest
    COPY --chown=root:root ../etc/crontabs/root /etc/crontabs
    ENTRYPOINT crond -f -L /var/log/crond.log
    
    JON
    JON --- ---
    MISO:
    tl;dr; zkontrolovat ls -la /etc/crontabs/root uvnitr kontejneru, jestli patri rootovi a jestli ma prava 644

    Jak jsem si s tim hral:

    dovolil jsem si zmenit command v docker-compose na
    command: crond -f -d0
    abych pro cronlog nemusel lezt do kontejneru a logovalo to vic

    takhle vypadaj crontabs v cistym alpinu
    
    / # ls -la /etc/crontabs/root 
    -rw-------    1 root     root           318 Nov  5 21:58 /etc/crontabs/root
    


    takhle vypada obsah crontabu s namountovanym volume z docker-compose.yml (pote co jsem souboru ./etc/crontabs/root na host machine zmenil opravneni na 644 - na to je cron haklivej)
    
    / # ls -la /etc/crontabs/root
    -rw-r--r--    1 1000     1000            41 Nov  5 22:03 /etc/crontabs/root
    

    takze problem bude v tom, ze se do kontejneru neprevedl majitel souboru jako root, takze ho cron vyignoruje

    Kdyz jsem pak uvnitr kontejneru smazal /etc/crontabs/root a vytvoril si novej s tvym obsahem, tak zapisuje.
    Kdyz jsem na host machine chownul ./etc/crontabs/root na root a pak spustil docker-compose up, tak to zapisovalo.
    Kdyz jsem chownul v kontejneru /etc/crontabs/root na root pred prvnim wakeupem cronu, tak to zapisovalo.
    ALE! Kdyz jsem chownul v kontejneru /etc/crontabs/root na root az po prvnim wakupu cronu, tak uz si ho pamatoval jako vyignorovanej a nic neprobehlo. To je ale zdokumentovana vlastnost (nekterych) cronu.
    MISO
    MISO --- ---
    JON, MARTEN: cron bezi pod rootom, aj to echo som uz skusal :-/ skuste si to spustit, skutocne by mali stacit tie 2 subory. Subor z /etc/crontabs/root sa nalinkuje do /var/spool/cron, crontab -l vypise spravne nastavenie, len to proste neseje :)

    # ps aux
    PID   USER     TIME  COMMAND
        1 root      0:00 crond -f -L /var/log/crond.log
        6 root      0:00 sh
       18 root      0:00 ps aux
    
    MARTEN
    MARTEN --- ---
    v base containerech zadny cron vetsinou nebezi. takze bych kouknul, jestli tam je, dost bych se divil
    JON
    JON --- ---
    MISO: zkusil bych misto nejakyho commandu jen echo "prdel" >> /date.txt
    a problem muze byt v tom, ze cron nebude mit prava zapisu skoro nikam. Tak bych to daval do /pokus/date,txt a pripadne tomu /pokus menil prava.
    MISO
    MISO --- ---
    DANIELSOFT: diky za tip, bohuzial to nepomohlo :-/ skor asi nahradim distro alpine za nieco ine

    
    / # crontab -l
    * * * * * /bin/date >> /date.txt
    
    DANIELSOFT
    DANIELSOFT --- ---
    DANIELSOFT: u cronu to někdy tak je, že nemá "dobře" nasetované některé proměnné prostředí, důvod jsem teď línej hledat (bezpečnost?)
    DANIELSOFT
    DANIELSOFT --- ---
    MISO: možná date není v $PATH - co dát plnou cestu, např. /bin/date >> /foo.txt
    MISO
    MISO --- ---
    Ahoj, prosim o nakopnutie. Kde robim chybu? Spustim docker-compose up, kontajner sa spusti, z /var/log/crond.log i ps aux je zrejme, ze crond bezi, akurat /foo.txt sa vobec nevytvori. Vopred dakujem za vas cas.

    docker-compose.yml
    version: '2'
    
    services:
    
      cron:
          image: alpine:latest
          volumes:
              - ./etc/crontabs:/etc/crontabs
          command: crond -f -L /var/log/crond.log
    


    /etc/crontabs/root
    
    * * * * * date >> /foo.txt
    
    RUDOLF
    RUDOLF --- ---
    ADM: jo srry, nezareagoval. Pak jsem si ráno uvědomil, že s RUN service crond start v Dockerfile není řešení;-) Tak jak říkáš to udělám. Prostě použiji ten postgres jako s image s vlastním CMD nebo entrypointem a tu zálehu provede.
    ADM
    ADM --- ---
    RUDOLF: proto jsem se ptal jak spoustis v postresi imagi ten crond, protoze na to musis prece ten entrypoint nejak upravit ...
    jinak my cron resili tak, ze byla jedna image (byla tam nejaka php aplikace, doinstaloval se cron, na entrypoint se nesahalo) a spustili jsme ze stejne image 2 sluzby, v docker compose nebo kubernetes je mozny externe predefinovat entrypoint, takze to php se spustilo normalne s default entrypointem z image a pro cron se jako entrypoint dalo spusteni crond
    RUDOLF
    RUDOLF --- ---
    Nevím kam s tím, nejdřív jsem přemýšlel o cloud auditku ale nakonec sem.

    Řeším, že bych rád použil AWS Fargate pro streamování z S3. Ale ještě jsem si to neošahal.

    Hlavní trabl je, že necheme použít ALB ani jiný druh load balancingu, kvůli pricingu (půjde tím tuna GB)

    Požadavek je:
    - zákoš dostane https spojení s friendly hostname (naše.doména.com)

    friendly hostname bych pořešil propagací fargate init/terminate eventu do SNS a lambda funkcí na úpravu route53.

    Ale nevím, jak naložit s TLS. Naše obyklá kombinace na serverech je nginx-proxy+nginx-proxy-companion. Ale teď bych musel řešit Let's encrypt per task a mít tak v kontejneru ještě paralelní let's encrypt, což vypadá na tunu trablů.
    RUDOLF
    RUDOLF --- ---
    ADM: jj, ale na ten entrypoint jsem nechtěl šahat.. Aby kdyby se změnil v uprestreamu, nemusel jsem ho u sebe pokaždé měnit..
    ADM
    ADM --- ---
    cron cte taky /etc/environment (bud ten z debianu nebo apline, uz nevim), takze se da udelat na zacatku entrypointu printenv do toho souboru
    Kliknutím sem můžete změnit nastavení reklam