AWS利用時にLinux踏み台サーバの操作ログを保存する方法です。
現在ではSessionManagerがあるのでこのような事をする場面は少なくなると思いますが
環境によってはサービス利用出来ない事もあるかと思いますのでメモしておきます。
AWSでは踏み台構築のクイックスタートとCloudFormationのテンプレートも用意されているので
細かい要件もなく手っ取り早く自動でログ保存してくれる踏み台を構築したい場合は
以下を参照ください。
AWS クラウドでの Linux 踏み台ホスト: クイックスタートリファレンスデプロイ
本記事は以下の記事を参考に解説、加筆・修正しています。
How to Record SSH Sessions Established Through a Bastion Host | AWS Security Blog
前提
踏み台にはLinuxサーバを利用し、シェルにはbashを利用。
この記事で実施する内容
・踏み台サーバのSSHセッションのログを記録する
・記録したログはS3に保存する
作業内容
ログ保存用フォルダの作成
ログ保存用フォルダにはec2-userのみアクセス権限を与えます。
setfacl(拡張ACL)も利用し再帰的に権限設定を行います。
mkdir /var/log/bastion
chown ec2-user:ec2-user /var/log/bastion
chmod -R 770 /var/log/bastion
setfacl -Rdm other:0 /var/log/bastion
OpenSSHの設定
SSHログイン時にカスタムスクリプト(/usr/bin/bastion/shell)を実行させるために
設定ファイルに以下の記載を追記します。
ForceCommand /usr/bin/bastion/shell
TCPフォワーディングを無効にしてログ記録の回避を抑止します。
環境要件によっては無効化出来ない場合もあるかと思いますが参考まで。
AllowTcpForwarding no
X11Forwarding no
ログオンスクリプトの作成
インタラクティブシェルをラップし、scriptコマンドを実行することで
vimなどのフルスクリーンアプリケーションの操作も記録するようにします。
操作ログは即時反映するようにオプション指定します。
ここでは–timingオプションを利用していますが、不要な場合も多いと思いますので
不要であればオプションは削除してください。
記録したコマンドはscriptreplayで再生が可能です。
# SSHのコマンド引数存在チェック。存在する場合はエラーとして実行不可とする。
if [[ -z $SSH_ORIGINAL_COMMAND ]]; then
# The format of log files is /var/log/bastion/YYYY-MM-DD_HH-MM-SS_user
LOG_FILE="`date --date="today" "+%Y-%m-%d_%H-%M-%S"`_`whoami`"
LOG_DIR="/var/log/bastion/"
# Print a welcome message
echo ""
echo "NOTE: This SSH session will be recorded"
echo "AUDIT KEY: $LOG_FILE"
echo ""
# ログの上書き、改善を防ぐためにサフィックスにランダム文字列を付与する
SUFFIX=`mktemp -u _XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
# インタラクティブシェルをラップしscriptコマンドを実行する
script -qf --timing=$LOG_DIR$LOG_FILE$SUFFIX.time $LOG_DIR$LOG_FILE$SUFFIX.data --command=/bin/bash
else
# The "script" program could be circumvented with some commands (e.g. bash, nc).
# Therefore, I intentionally prevent users from supplying commands.
echo "This bastion supports interactive sessions only. Do not supply a command"
exit 1
fi
スクリプトに実行権限を付与します。
chmod a+x /usr/bin/bastion/shell
ログの一覧表示を抑止するためにログフォルダのグループ所有者・権限を変更します。
chown root:ec2-user /usr/bin/script
chmod g+s /usr/bin/script
必要であれば他のユーザのプロセスを見えないように設定します。
簡易的なプロセスを隠蔽方法であるため回避策があることに留意してください。
mount -o remount,rw,hidepid=2 /proc
awk '!/proc/' /etc/fstab > temp && mv temp /etc/fstab
echo "proc /proc proc defaults,hidepid=2 0 0" >> /etc/fstab
SSHサービスを再起動して設定を反映します。
service sshd restart
ログファイルのS3保存
ログのS3コピーシェルを作成します。バケット名などは環境に合わせて修正してください。
LOG_DIR="/var/log/bastion/"
aws s3 cp $LOG_DIR s3://bucket-name/logs/ --sse --region region --recursive && find $LOG_DIR* -mtime +1 -exec rm {} \;
オーナーだけに権限を付与します。あとはcron登録しておくだけです。
chmod 700 /usr/bin/bastion/sync_s3
なにかと面倒だったりデメリットもあるので基本的にはSessionManagerを利用した方が良いかと思います。
以上