• ú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í
    DEFILA
    DEFILA --- ---
    DEFILA:
    stare ale stale hezke Danovo povidani o libpod
    tedy pokud je tvuj problem zpusobeny security politikou Linuchu :)

    duvodu muze byt spousta, rozhodne nemem prava v /proc/ :D
    DEFILA
    DEFILA --- ---
    ADM:
    hu!
    ne - tam maji pristup kerlen 'procesy' to, ze je vlastni root, je naprosto vporadku; takhle pak vznikaji exploity, kdy se ti z kontejneru nekdo pres shell dostane na hostovaci VM ...


    URPUTNIK:

    aha :)
    SElinux je standartni security polic na RHEL(Fedora) based systemech, kazdy file(tedy prakticky vse, vcetne socketu a portu....) ma svuj stitek (label) vylistovatelny pres ls -lZ(Z pro Selinuch); pokud se tva aplikace snazi zapsat nekam, kde neni prirazeny spravny stitek, tak ji to kopne pryc bez ohledu zda je root nebo ne

    dle tvych prispevku jsi na Debianu - ten tlacii apparmor, pokud si dobre pamatuju(nejsem uzivatelem Debianu)
    ADM
    ADM --- ---
    URPUTNIK: no a ten /proc/1/fd/1 a i /dev/pts/0 vlastni root, takze tam nezapises. muzes si tam zkusit zmenit prava z toho kontejneru v shellu, a pak otestovat zda zalogujes s aplikace (tak jak to mas puvodne), melo by to jit, ale tvuj problem to nevyresi, musel bys ty prava upravit po spusteni kontejneru
    URPUTNIK
    URPUTNIK --- ---
    ADM: ah, pardon, jsem natvrdlej .. ale je to stejne akorat symlink do /dev/pts, ktery ma root
    root@0826b2dc6932:/usr/local/php# ls -la /proc/1/fd/1
    lrwx------ 1 root root 64 May 28 15:06 /proc/1/fd/1 -> /dev/pts/0

    problem s primym pouzitim php://stdout mam v tom, ze to znamena upravit zdrojak aplikace (coz nechci, aby se nam nerozjizdela codebase) .. asi to holt budu v ramci buildu prepisovat na stdout, tech mist jsou nastesti jednotky :)

    diky moc za popostrceni!
    ADM
    ADM --- ---
    URPUTNIK: davas tam furt *self*, coz je proces toho shellu, ne apache

    ale fopen('php://stdout', 'w') - tohle je spravne reseni, timhle to php samo protlaci do parent procesu (toho pid apache)
    URPUTNIK
    URPUTNIK --- ---
    URPUTNIK:
    
    root@aa553164e3bf:/var/www/xmlrpc# ls -la /proc/self/fd/1 
    lrwx------ 1 root root 64 May 28 15:02 /proc/self/fd/1 -> /dev/pts/1
    root@aa553164e3bf:/var/www/xmlrpc# ls -la /dev/pts/1 
    crw--w---- 1 root tty 136, 1 May 28 15:02 /dev/pts/1
    


    kazdopadne mi ted nedava smysl, proc tohle funguje:
    fopen('php://stdout', 'w')

    protoze php://stdout interpretuje/obaluje apache?
    ADM
    ADM --- ---
    URPUTNIK: nene ten vypis nic neznamena, podivej se na /proc/1/fd/*.
    v ty oficialni image je to nastaveno jako log pro apache a pro nej to funguje, z php kodu tam imho nezalogujes, pokud to nejde nastavit v konfiguraci mod_php
    URPUTNIK
    URPUTNIK --- ---
    DEFILA: nejsem admin, takze to budes muset asi rozvest :) mne ty symlinky prijdou stejne nastaveny, jako pro ten apache, kde ale fungujou :[ kazdopadne phpinfo() zacina s
    Linux 63f6b1c48b39 4.15.0-50-generic #54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64
    open_basedir je prazdny a safe_mode tam neni, protoze php7+ ..

    ADM: aha! to zni logicky
    
    root@aa553164e3bf:/var/www/xmlrpc# ls -la /dev/st*
    lrwxrwxrwx 1 root root 15 May 28 14:52 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 May 28 14:52 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 May 28 14:52 /dev/stdout -> /proc/self/fd/1
    

    predpokladam, ze poustet php pod rootem bude security dira jako krava, co? :) zeptam se nasich adminu .. diky!
    ADM
    ADM --- ---
    URPUTNIK: v php-fpm docker image (v image pro apache mod_php to bude zrejme obdobne) ten symlink odkazuje na stdout stderr pidu 1 a ten by mel bezet pod rootem (ted si to neoverim), az child workers bezi pod www-data, takze tezko do toho logu budes zapisovat z tech apache workeru. to by mohl byt tenhle problem
    DEFILA
    DEFILA --- ---
    URPUTNIK: SElinux?:)
    URPUTNIK
    URPUTNIK --- ---
    URPUTNIK: tak aktualni zaver je, ze aplikaci nechame jak je .. akorat pro pouziti ve dockeru, kdyz se vytvari image, misto souboru se podstrci symlinky na /dev/stdout (uplne stejne se to resi v oficialnim php docker image) .. takhle:
    
    RUN set -eux ; \
        cd /app/log/ ; \
        touch app.log ;\
        ln -sfT /dev/stdout app.log ; \
       chown -R --no-dereference www-data:www-data . ;
    

    uvnitr pustenyho image ty symlinky vypadaj stejne, jako ty pro apache access/error:
    root@63f6b1c48b39:/app# ls -la /var/log/apache2/
    total 8
    drwxrwxrwx 2 www-data www-data 4096 May  8 02:37 .
    drwxr-xr-x 1 root     root     4096 May  8 02:37 ..
    lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 access.log -> /dev/stdout
    lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 error.log -> /dev/stderr
    lrwxrwxrwx 1 www-data www-data   11 May  8 02:37 other_vhosts_access.log -> /dev/stdout
    root@63f6b1c48b39:/app# ls -la log/
    total 8
    drwxr-xr-x 1 www-data www-data 4096 May 28 13:55 .
    drwxr-xr-x 1 root     root     4096 May 28 13:55 ..
    lrwxrwxrwx 1 www-data www-data   11 May 28 13:55 app.log -> /dev/stdout
    

    nicmene ve chvili, kdy do nich zkusi php zapsat
    
     if ($f = fopen($logfile, 'a')) {
        fwrite($f, strftime("%Y/%m/%d - %H:%M:%S: ") . $data);
        fclose($f);
        return true;
    } else {
       return false;
    }
    

    tak to spadne
    Warning:  fopen(/app/log/app.log): failed to open stream: Permission denied in ..


    takze, co mi uteklo? :/
    ADM
    ADM --- ---
    URPUTNIK: pokud mas docker logging driver journald, tak teoreticky muzes z jednoho containeru vytahnout 2 ruzny logy s tim ze je rozlisis dle stdout a stderr, logshipping z journald do ES to vetsinou zachova, takze si to muzes podle toho vyselektovat (v kibane treba). cili bys treba php log posilal na stderr a aplikacni na stdout (ale zrovna v oficialni php-fpm image tohle nejde, je tam k tomu v dockerfile nejaky comment), jinak pokud bys oba ty logy michal do jednoho vystupu tak je jedina moznost ten aplikacni log prefixovat. nejjednodussi reseni je proste opravdu mit jeden log z jednoho containeru (stdout), protoze je pak mnohem jednodussi implementace jakehokoli log collection reseni. pokud bude kazdy service logovat ruznym zpusobem tak se to bude obtizne spravovat, zalezi samozrejme o jakem mnozstvi sluzeb se bavime
    DANIELSOFT
    DANIELSOFT --- ---
    co prikaz "docker log" ? ten si pamatuje a vypisuje stdout, pokud vim
    URPUTNIK
    URPUTNIK --- ---
    BLACKOUT: takze ty message na stdout necim prefixujete? nebo v kontextu aplikace to neresite, ale ten, kdo to posila do ES, to prefixuje?

    QUIP: zatim jsou to kusy kontejneru~servis, ale budou hur/lip :) a je to ted do souboru, protoze jde o dockerizaci stare php aplikace, kde nechci delat 2 zmeny naraz - poustet to v dockeru a jeste k tomu menit funkcnost (protoze vedle toho bezi nevirtualizovane produkcni prostredi)
    INDIAN
    INDIAN --- ---
    +1 za ES - pokud to neni naka jednorazova vec a pro ES na danou platformu existuje handler
    QUIP
    QUIP --- ---
    URPUTNIK: Nevim, v jakem prostredi to resis. Jestli mas jeden kontajner, nebo vic... ale co treba logovat po siti do syslogu / rsyslogu atp.? Pak nemusis mit v tom kontajneru zadne logovani do souboru a pritom muzes posilat data z kolika chces sluzeb najednou.
    BLACKOUT
    BLACKOUT --- ---
    URPUTNIK: Osobne idem stylom stdout, a separe debug do kibany.
    Tak nam to funguje cca na 350+ microservice-och (je to pain potom v kibane ale developer lúza sa nestazuje :D)
    ADMIX
    ADMIX --- ---
    URPUTNIK: sypat veci do souboru neni nutne na prekazku, ale nevim jak to funguje s logovacima knihovnama; kubernetes nevim, ale i ten blbej nomad na to mel mechanismus ze ti do kontejneru namapoval treba 100MB tmpfs na logy, ze kterejch jsi jednak moh primo cist, a jednak je shippovat nekam do elastiku nebo podobne, pocitam ze kubernetes na tohle bude mit deployment v podobnym stylu
    URPUTNIK
    URPUTNIK --- ---
    tak novy dotaz :) jedna z best-practice pri psani docker image, je posilat vsechny data/logy misto do souboru na stdout .. coz je samozrejme hezky a neplni se to do image, takze o to clovek neprijde, kdyz je potreba image vypnout .. u nas je napr php aplikace, ktera generuje 3 logy - access log apache, php_error_log a business logy, co si zapisuje sama aplikace ..
    ten oficialni docker php image pise na stdout, access log i php_error_log (ten asi sype na stderr, uplne to nepoznam), ale ty business logy jsou (ted) do souboru ..

    takze kdyz to budem poustet v kubernetim clusteru, muzem budto vsechno posilat do souboru (patrne teda do 1 adresare, at se jednoduse sdili slozka s logstash sluzbou .. v nem pak budou definice pro jednotlivy souboru ..) nebo obracene, vsechno co ted zapisuje do souboru budu sypat na stdout/err .. predpokladam, ze ale v tom stdout se to bude michat, tzn prefixujou se napr ty message?

    nejakou variantu jsem minul? nejaky uz vynalezeny kolo? :) zatim se klonime k tomu sypat to vsechno do souboru (tak je to konckoncu ted pusteny v realnym nevirtualizovanym prostredi)
    URPUTNIK
    URPUTNIK --- ---
    QUIP: jj, rozumim, uz jsem se ptal i v php klubu .. a dospel jsem ke stejnym zaverum, takze diky za potvrzeni!
    QUIP
    QUIP --- ---
    URPUTNIK: S PHP 5.2 mas asi nejvetsi problem v tom, ze se malo kdo zabyval prechodem z 5.2 na 7.x Vetsina tech nekompatibilit zminuje rozdily mezi nejakou posledni vetvi 5.x, takze vetsinou 5.6 => 7.0
    Pokud se budete v te aplikaci stourat, aby fungovala na PHP 7.x, tak ji rovnou testujte na 7.3 (nebo aspon 7.2) 7.0 uz je EOL.
    Tudiz budes muset nejspis hledat nekompatibility mezi 5.2 - 5.6, 5.6 - 7.0 a pak 7.0 - 7.3
    https://www.php.net/manual/en/migration73.php
    https://www.php.net/manual/en/migration53.incompatible.php
    https://www.php.net/manual/en/migration54.incompatible.php
    https://www.php.net/manual/en/migration55.incompatible.php
    https://www.php.net/manual/en/migration56.incompatible.php
    https://www.php.net/manual/en/migration70.incompatible.php
    https://www.php.net/manual/en/migration71.incompatible.php
    https://www.php.net/manual/en/migration72.incompatible.php
    https://www.php.net/manual/en/migration73.incompatible.php

    ...ale tohle neni o Dockeru, to je proste o PHP

    https://github.com/sstalle/php7cc
    https://github.com/gisostallenberg/php-to-7-aid
    Kliknutím sem můžete změnit nastavení reklam