Di bagian pertama dari seri ini, saya menyoroti beberapa manfaat dari perekaman sesi dan penggunaan server SSH dalam wadah. Saya juga memamerkan arsitektur tingkat tinggi. Sebagai langkah persiapan, salah satu server dengan RHEL 8.2 dikonfigurasi untuk membuat dan menghosting container rootless server SSH.
Setelah menyiapkan server dan membuat pengguna (tester2
), kami membuat Dockerfile khusus untuk server SSH dengan perekaman sesi yang dikonfigurasi.
Dalam file Docker berikut, kami menggunakan gambar ubi-init (multi-layanan), yang mendukung systemd
dan memiliki CMD /sbin/init
sebagai default untuk memulai systemd
layanan ini. Asumsi berikut dibuat untuk penyiapan ini.
- Layanan mengekspos port 2022 alih-alih 22 dalam wadah untuk SSH
- Konfigurasikan tiga pengguna (yaitu
tester
,tester2
, dantester3
) - Gunakan UID yang sama untuk
tester
pengguna kontainer sebagai pengguna (tester2
) menjalankan container tanpa root pada host sehingga pengguna ini dapat menjadi root di dalam container - Ubah UID untuk
tester
dalam wadah sebagai 0 (root) - Konfigurasikan kunci SSH sebagai argumen build untuk
tester
pengguna dantester2
dan login berbasis kata sandi untuktester3
- Konfigurasikan perekaman sesi untuk pengguna
tester2
dantester3
dengan mengatur shell login sebagai/usr/bin/tlog-rec-session
- Petakan volume persisten untuk
/home
dan/var/log/journal
selama pembuatan wadah untuk mempertahankan direktori beranda pengguna dan layanan SSH dan log rekaman sesi - Salin
tlog-rec-session.conf
dari host ke dalam wadah dengan konfigurasi berikut untuk menangkap log rekaman sesi menggunakanjournald
:
{"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"}
[ Cobalah perekaman sesi di lab langsung: Mengonfigurasi Perekaman Sesi Terminal ]
Dockerfile untuk wadah SSH
Berikut adalah contoh Dockerfile untuk wadah 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"]
Simpan file di direktori home sebagai sshdockfile.
Salin /etc/tlog/tlog-rec-session.conf
default ke direktori home.
Buat gambar kontainer
Untuk membuat gambar kontainer dengan kunci yang diinginkan, buat sepasang kunci baru untuk pengguna. Selanjutnya, ekspor default dan kunci publik yang baru dibuat sebagai variabel. Terakhir, berikan mereka sebagai argumen build menggunakan yang berikut ini. Berikut prosesnya:
# 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
argumen membutuhkan cgroups-v2 dan diperlukan untuk wadah tanpa akar untuk menggunakan systemd
berhasil. Podman melaporkan kesalahan berikut kecuali argumen ini diteruskan:
systemd cgroup flag passed, but systemd support for managing cgroups is not available: OCI runtime error
Jika build berhasil, langkah selanjutnya adalah menjalankan container dengan volume persisten yang diinginkan. Volume ini (untuk /var/log/journal
dan /home
) sudah dibuat sebelumnya, atau Podman membuatnya secara dinamis di volume
direktori di bawah lokasi penyimpanan default (podman info | grep -i graphroot
).
Jalankan server SSH
Karena container rootless tidak mendukung plugin CNI untuk jaringan, port pilihan yang lebih tinggi (>1024) dipetakan untuk mengekspos layanan SSH.
# podman run -d --name=rootless_ssh1 -v ssh1home:/home:Z -v ssh1logs:/var/log/journal:Z -p 33000:2022 --cgroup-manager=cgroupfs localhost/testsshd
Uji akses SSH
Dari mesin host, masuk ke server SSH menggunakan kunci SSH untuk pengguna tester
dan tester2
, dan kata sandi (redhat123
) untuk 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
Pesan bahwa sesi sedang direkam muncul untuk tester2
dan tester3
.
Validasi rekaman sesi
Setelah masuk sebagai testuser2
dan testuser3
dan menjalankan beberapa perintah, ada tlog
entri dalam file log jurnal. Sebagai tester
pengguna, jalankan perintah berikut di dalam wadah:
# journalctl | grep tlog-rec-session
Setiap tlog
entri memiliki ID host, ID catatan, dan pengguna terkait. Misalnya:
"host":"0ce2921675b0","rec":"26b55a3aafd94f40b49473ac33bd2c96-42-f99b3","user":"tester2"
Entri log ini juga dapat diakses dari host menggunakan volume
lokasi:
/home/test2/.local/share/containers/storage/volumes/ssh1logs/_data/<containerid>/system.journal
Mungkin ada lebih dari satu direktori di bawah ssh1logs/_data
jika penampung sebelumnya telah dihentikan dan penampung baru menggantikannya.
Putar ulang sesi yang direkam
tlog-play
perintah mendukung pemutaran ulang sesi. Biasanya administrator tertarik untuk memutar ulang sesi pengguna tertentu. Untuk mencapainya, ekspor entri sesi untuk sesi tertentu dari log jurnal dan simpan ke dalam file lokal.
Identifikasi ID catatan tertentu dan gunakan itu untuk memfilter semua catatan dengan awk
berikut perintah:
# 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
Dengan cara ini, administrator dapat memisahkan dan menyimpan log sesi tertentu untuk setiap sesi pengguna dan memutar ulang sesuai permintaan. Log sesi ini juga dapat dikirim ke lokasi pusat untuk tujuan audit. Secara default, tlog
tidak menangkap input standar untuk pengguna, sehingga informasi sensitif seperti sandi tidak ditangkap dan disimpan dalam log.
Lebih dari satu server SSH dalam container dapat dijalankan secara bersamaan pada host (menggunakan pemetaan port yang berbeda), dengan masing-masing container memiliki profil pengguna yang terpisah dan pemetaan volume persisten yang terpisah. Wadah itu sendiri juga dapat dikonfigurasi sebagai systemd
layanan di host untuk memulainya saat boot.
Menutup
Kami memperkenalkan Red Hat IDM dan server backend (terintegrasi dengan IDM) di bagian selanjutnya. Kontrol akses berbasis host dan sudo
terpusat akan dikonfigurasi untuk pengguna/grup dari IDM untuk mengelola pengguna mana yang dapat menjalankan perintah apa di host mana.
[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]