このシリーズの最初のパートでは、セッション記録とコンテナー化されたSSHサーバーの使用の利点のいくつかを強調しました。また、高レベルのアーキテクチャも紹介しました。準備手順として、RHEL 8.2を搭載したサーバーの1つが、SSHサーバーのルートレスコンテナーを構築およびホストするように構成されました。
サーバーを準備してユーザーを作成した後(tester2
)、セッション記録が構成されたSSHサーバー用のカスタムDockerfileを作成します。
次のDockerfileでは、systemd
をサポートするubi-init(マルチサービス)イメージを利用しています。 CMD /sbin/init
があります systemd
を開始するデフォルトとして initサービス。この設定では、次の前提があります。
- サービスは、SSHのコンテナ内で22ではなく2022のポートを公開します
- 3人のユーザー(つまり、
tester
を構成します 、tester2
、およびtester3
) - コンテナユーザー
tester
に同じUIDを使用する ユーザーとして(tester2
)このユーザーがコンテナ内でルート化できるように、ホスト上でルートレスコンテナを実行する tester
のUIDを変更する コンテナ内で0(ルート)として- SSHキーをユーザー
tester
のビルド引数として構成します およびtester2
tester3
のパスワードベースのログイン - ユーザーのセッション記録を構成する
tester2
およびtester3
ログインシェルを/usr/bin/tlog-rec-session
として設定します -
/home
の永続ボリュームをマップします および/var/log/journal
ユーザーのホームディレクトリとSSHサービスおよびセッション記録ログを保持するためのコンテナ作成中 -
tlog-rec-session.conf
をコピーします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"}
[ライブラボでセッションレコーディングを試す:ターミナルセッションレコーディングの構成]
SSHコンテナのDockerfile
SSHコンテナのサンプルDockerfileは次のとおりです。
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"]
ファイルをホームディレクトリにsshdockfile.
として保存します。 デフォルトの/etc/tlog/tlog-rec-session.conf
をコピーします ホームディレクトリに移動します。
コンテナイメージを作成する
目的のキーを使用してコンテナイメージを作成するには、ユーザーの新しいキーのペアを生成します。次に、デフォルトと新しく作成された公開鍵を変数としてエクスポートします。最後に、以下を使用してビルド引数としてそれらを渡します。プロセスは次のとおりです。
# 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
引数にはcgroups-v2が必要であり、ルートレスコンテナがsystemd
を使用するために必要です。 正常に。この引数が渡されない限り、Podmanは次のエラーを報告します:
systemd cgroup flag passed, but systemd support for managing cgroups is not available: OCI runtime error
ビルドが成功した場合、次のステップは、目的の永続ボリュームでコンテナーを実行することです。これらのボリューム(/var/log/journal
用) および/home
)は事前に作成されているか、Podmanがvolume
で動的に作成します デフォルトの保存場所の下にあるディレクトリ(podman info | grep -i graphroot
。
SSHサーバーを実行します
ルートレスコンテナはネットワーキング用のCNIプラグインをサポートしていないため、SSHサービスを公開するために優先される上位ポート(> 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
SSHアクセスのテスト
ホストマシンから、ユーザーtester
のSSHキーを使用してSSHサーバーにログインします。 およびtester2
、およびパスワード(redhat123
)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
tester2
にセッションが記録されているというメッセージが表示されます およびtester3
。
セッションの記録を検証する
testuser2
としてログに記録した後 およびtestuser3
いくつかのコマンドを実行すると、tlog
があります ジャーナルログファイルのエントリ。 tester
として ユーザーは、コンテナ内で次のコマンドを実行します。
# journalctl | grep tlog-rec-session
各tlog
エントリには、ホストID、レコードID、および関連付けられたユーザーが含まれます。例:
"host":"0ce2921675b0","rec":"26b55a3aafd94f40b49473ac33bd2c96-42-f99b3","user":"tester2"
これらのログエントリには、ホストからvolume
を使用してアクセスすることもできます。 場所:
/home/test2/.local/share/containers/storage/volumes/ssh1logs/_data/<containerid>/system.journal
ssh1logs/_data
の下に複数のディレクトリがある場合があります 以前のコンテナが終了し、新しいコンテナがそれを置き換えた場合。
記録されたセッションを再生する
tlog-play
コマンドは、セッションの再生をサポートします。通常、管理者は特定のユーザーセッションの再生に関心があります。これを実現するには、その特定のセッションのセッションエントリをジャーナルログからエクスポートし、ローカルファイルに保存します。
特定のレコードIDを特定し、それを使用して次のawk
ですべてのレコードをフィルタリングします コマンド:
# 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
このようにして、管理者は各ユーザーセッションの特定のセッションログを分離して保存し、オンデマンドで再生できます。これらのセッションログは、監査目的で中央の場所に送信することもできます。デフォルトでは、tlog
ユーザーの標準入力をキャプチャしないため、パスワードなどの機密情報がキャプチャされてログに保存されることはありません。
複数のコンテナー化されたSSHサーバーをホスト上で同時に実行でき(異なるポートマッピングを使用)、各コンテナーは個別のユーザープロファイルと個別の永続ボリュームマッピングを持ちます。コンテナー自体は、systemd
として構成することもできます。 ホスト上のサービスを起動時に開始します。
まとめ
次のパートでは、Red Hat IDMとバックエンドサーバー(IDMと統合)を紹介します。ホストベースのアクセス制御と一元化されたsudo
IDMのユーザー/グループに対して、どのユーザーがどのホストでどのコマンドを実行できるかを管理するように構成されます。
[コンテナを使い始めますか?この無料コースをチェックしてください。コンテナ化されたアプリケーションのデプロイ:技術的な概要。 ]