V první části této série jsem zdůraznil některé výhody nahrávání relací a použití kontejnerových serverů SSH. Také jsem předvedl architekturu na vysoké úrovni. Jako přípravný krok byl jeden ze serverů s RHEL 8.2 nakonfigurován pro vytváření a hostování bezkořenových kontejnerů serveru SSH.
Po přípravě serveru a vytvoření uživatele (tester2
), vytvoříme vlastní Dockerfile pro SSH server s nakonfigurovaným nahráváním relace.
V následujícím souboru Dockerfile používáme obraz ubi-init (multi-service), který podporuje systemd
a má CMD /sbin/init
jako výchozí pro spuštění systemd
init službu. Pro toto nastavení platí následující předpoklady.
- Služba zpřístupňuje port 2022 namísto 22 v kontejneru pro SSH
- Nakonfigurujte tři uživatele (jmenovitě
tester
,tester2
atester3
) - Pro uživatele kontejneru
tester
použijte stejné UID jako uživatel (tester2
) spuštění kontejneru bez root na hostiteli, aby tento uživatel mohl být root v kontejneru - Změňte UID pro
tester
v kontejneru jako 0 (kořen) - Nakonfigurujte klíče SSH jako argumenty sestavení pro uživatele
tester
atester2
a přihlášení na základě hesla protester3
- Nakonfigurujte nahrávání relace pro uživatele
tester2
atester3
nastavením přihlašovacího shellu jako/usr/bin/tlog-rec-session
- Namapujte trvalé svazky pro
/home
a/var/log/journal
během vytváření kontejneru, aby byly zachovány domovské adresáře uživatelů a protokoly záznamu služeb SSH a relací - Zkopírujte soubor
tlog-rec-session.conf
z hostitele do kontejneru s následující konfigurací pro zachycování protokolů záznamu relací pomocíjournald
:
{"shell":"/bin/bash","notice":"\nATTENTION! Your session is being recorded!\n\n","latency":10,"payload":2048,"log":{"input":false,"output":true,"window":true},"limit":{"rate":16384,"burst":32768,"action":"pass"},"file":{"path":""},"syslog":{"facility":"authpriv","priority":"info"},"journal":{"priority":"info","augment":true},"writer":"journal"}
[ Vyzkoušejte si záznam relace v živé laboratoři: Konfigurace záznamu relace na terminálu ]
Dockerfile pro kontejner SSH
Zde je ukázkový soubor Dockerfile pro kontejner SSH:
FROM ubi8/ubi-init
ARG ADMIN_PUBLIC_KEY
ARG TESTER2_PUBLIC_KEY
RUN yum -y install openssh-server ed openssh-clients tlog glibc-langpack-en && yum clean all && systemctl enable sshd;
RUN sed -i 's/#Port.*$/Port 2022/' /etc/ssh/sshd_config && chmod 775 /var/run && rm -f /var/run/nologin
RUN mkdir /etc/systemd/system/sshd.service.d/ && echo -e '[Service]\nRestart=always' > /etc/systemd/system/sshd.service.d/sshd.conf
COPY tlog-rec-session.conf /etc/tlog/tlog-rec-session.conf
RUN adduser --system -s /bin/bash -u 1001 tester && \ #UID matching user uid on host
adduser --system -s /usr/bin/tlog-rec-session -u 1000 tester2 && \
adduser --system -s /usr/bin/tlog-rec-session -u 1002 tester3 -p y5utxaxUDNFII && \
mkdir -p /home/tester/.ssh /home/tester2/.ssh /home/tester3/.ssh
RUN touch /home/tester/.ssh/authorized_keys /home/tester2/.ssh/authorized_keys /home/tester3/.ssh/authorized_keys && \
chmod 700 /home/tester/.ssh /home/tester2/.ssh /home/tester3/.ssh && \
chmod 600 /home/tester/.ssh/authorized_keys /home/tester2/.ssh/authorized_keys /home/tester3/.ssh/authorized_keys && \
sed -i 's/1001/0/g' /etc/passwd && \ #Update UID with root UID
echo ${ADMIN_PUBLIC_KEY} >> /home/tester/.ssh/authorized_keys && \
echo ${TESTER2_PUBLIC_KEY} >> /home/tester2/.ssh/authorized_keys && \
chown -R tester2:tester2 /home/tester2/ && chown -R tester3:tester3 /home/tester3/ && chown -R tester:tester /home/tester
LABEL Description="This ssh server is running systemd with rootless podman"
EXPOSE 2022
CMD ["/sbin/init"]
Uložte soubor do domovského adresáře jako sshdockfile.
Zkopírujte výchozí /etc/tlog/tlog-rec-session.conf
do domovského adresáře.
Vytvořte obrázek kontejneru
Chcete-li vytvořit obrázek kontejneru s požadovanými klíči, vygenerujte pro uživatele nový pár klíčů. Dále exportujte výchozí a nově vytvořený veřejný klíč jako proměnné. Nakonec je předejte jako argumenty sestavení pomocí následujícího. Zde je postup:
# ssh-keygen-t ecdsa ; ssh-keygen -t ecdsa -f .ssh/tester2
# export ADMIN_PUBLIC_KEY=`cat /home/test2/.ssh/id_ecdsa.pub`
# export TESTER2_PUBLIC_KEY=`cat /home/test2/.ssh/tester2.pub`
# podman build -t testsshd -f sshdockfile --cgroup-manager=cgroupfs --build-arg ADMIN_PUBLIC_KEY="$ADMIN_PUBLIC_KEY" --build-arg TESTER2_PUBLIC_KEY="$TESTER2_PUBLIC_KEY"
cgroup-manager
argument vyžaduje cgroups-v2 a je nezbytný pro to, aby kontejner bez root používal systemd
úspěšně. Podman hlásí následující chybu, pokud není tento argument předán:
systemd cgroup flag passed, but systemd support for managing cgroups is not available: OCI runtime error
Pokud je sestavení úspěšné, dalším krokem je spuštění kontejneru s požadovanými trvalými svazky. Tyto svazky (pro /var/log/journal
a /home
) jsou buď předem vytvořené, nebo je Podman vytváří dynamicky v volume
adresář ve výchozím umístění úložiště (podman info | grep -i graphroot
).
Spusťte server SSH
Protože kontejnery bez rootu nepodporují zásuvné moduly CNI pro síťování, je k odhalení služby SSH namapován preferovaný vyšší port (>1024).
# podman run -d --name=rootless_ssh1 -v ssh1home:/home:Z -v ssh1logs:/var/log/journal:Z -p 33000:2022 --cgroup-manager=cgroupfs localhost/testsshd
Otestujte přístup SSH
Z hostitelského počítače se přihlaste k serveru SSH pomocí klíčů SSH pro uživatele tester
a tester2
a heslo (redhat123
) pro tester3
.
# ssh -l tester -i /home/test2/.ssh/id_ecdsa localhost -p 33000
# ssh -l tester2 -i /home/test2/.ssh/tester2 localhost -p 33000
# ssh -l tester3 localhost -p 33000
Pro tester2
se zobrazí zpráva, že se relace nahrává a tester3
.
Ověřit záznam relace
Po přihlášení jako testuser2
a testuser3
a provádění některých příkazů, existují tlog
záznamy v souboru deníku. Jako tester
uživatel, spusťte v kontejneru následující příkaz:
# journalctl | grep tlog-rec-session
Každý tlog
záznam má ID hostitele, ID záznamu a přidruženého uživatele. Například:
"host":"0ce2921675b0","rec":"26b55a3aafd94f40b49473ac33bd2c96-42-f99b3","user":"tester2"
Tyto položky protokolu jsou také přístupné z hostitele pomocí volume
umístění:
/home/test2/.local/share/containers/storage/volumes/ssh1logs/_data/<containerid>/system.journal
Pod ssh1logs/_data
může být více než jeden adresář pokud byl předchozí kontejner(y) ukončen a nahrazen novým.
Přehrání nahrané relace
tlog-play
příkaz podporuje přehrávání relace. Administrátor má obvykle zájem o přehrání konkrétní uživatelské relace. Chcete-li toho dosáhnout, exportujte položky relace pro danou relaci z protokolů žurnálu a uložte je do místního souboru.
Identifikujte konkrétní ID záznamu a použijte jej k filtrování všech záznamů pomocí následujícího awk
příkaz:
# journalctl --file .local/share/containers/storage/volumes/ssh1logs/_data/<containerid>/system.journal | awk -F '{"' '$0~/<tlog record id>/{ print "\{\"" $2 }' 2>/dev/null > ~/session_recording.log
# tlog-play -r file -i ~/session_recording.log
Tímto způsobem mohou administrátoři oddělit a uložit specifické protokoly relací pro každou uživatelskou relaci a na požádání je přehrát. Tyto protokoly relací lze také odeslat do centrálního umístění pro účely auditu. Ve výchozím nastavení tlog
nezachycuje standardní vstup pro uživatele, takže citlivé informace, jako jsou hesla, nejsou zachyceny a uloženy v protokolech.
Na hostiteli lze současně provozovat více než jeden kontejnerizovaný server SSH (pomocí různých mapování portů), přičemž každý z kontejnerů má samostatné uživatelské profily a samostatná mapování trvalých svazků. Samotné kontejnery lze také nakonfigurovat jako systemd
služby na hostiteli, abyste je spustili při spouštění.
Sbalit
V příštím díle představíme Red Hat IDM a backend servery (integrované s IDM). Řízení přístupu založené na hostiteli a centralizované sudo
bude nakonfigurován pro uživatele/skupiny z IDM, aby bylo možné spravovat, kteří uživatelé mohou provádět jaké příkazy na kterých hostitelích.
[ Začínáte s kontejnery? Podívejte se na tento bezplatný kurz. Nasazení kontejnerových aplikací:technický přehled. ]