AWS EC2のSSH操作ログを自動記録&S3へ保管する

セキュリティ強化の目的として、AWSのEC2でSSHセッションの記録を自動で行い、S3へ転送する設定方法を説明します。

 

EC2はSession Managerからの接続はAWSで自動にログ記録を行ってくれますが、SSH接続の場合は操作ログの記録はありません。
特にEC2を踏み台サーバに利用している場合、プライベートサブネットに配置しているサーバ等への踏み台サーバ操作ログを予め記録しておくと安心できると思います。

SSHセッションの記録方法について、AWS公式に手順があり、参考にしながら設定手順を説明します。

 

設定方法

1. ログ保管用S3バケットの作成

最初にログ保管用のS3バケットを用意してください。
ここでは s3://bastion-logs として作成しております。

 

2. 各種ディレクトリの準備と設定

以下のコマンドをEC2 踏み台サーバ上で行います。
説明として、ログ保存用のディレクトリとして /var/log/bastion を作成した後、sshd_configにカスタムスクリプトを実行させる設定を追記する流れです。

# rootで操作
sudo su -

# ログ保存用フォルダ作成
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でログイン時にカスタムスクリプトを実行させる設定
echo -e "\nForceCommand /usr/bin/bastion/shell" >> /etc/ssh/sshd_config

# カスタムスクリプト用ディレクトリ作成
mkdir /usr/bin/bastion

# shell作成
vim /usr/bin/bastion/shell

 

/usr/bin/bastion/shell

以下のシェルスクリプトを作成します。
scriptコマンドを使いセッションを記録し /var/log/bastion/ ディレクトリへログファイルを保存する内容です。

#
# Custom script to Record SSH Sessions for bastion host
#

# Check that the SSH client did not supply a command
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 ""

# I suffix the log file name with a random string. I explain why
# later on.
SUFFIX=`mktemp -u _XXXXXXXXXXXX`

# Wrap an interactive shell into "script" to record the SSH session
script -qf $LOG_DIR$LOG_FILE$SUFFIX.data --command="/bin/bash --login"

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

 

作成後はパーミッションと所有権の設定を行い、sshdサービスを再起動します。

chmod a+x /usr/bin/bastion/shell
chown root:ec2-user /usr/bin/script
chmod g+s /usr/bin/script

# sshd restart
systemctl restart sshd

 

3. ログファイルのS3転送設定

1で作成したS3へログファイルを転送するためのシェルスクリプトを作成します。

vim /usr/bin/bastion/sync_s3

 

/usr/bin/bastion/sync_s3

aws s3 cpコマンドでローカル保存した /var/log/bastion ディレクトリ内のログをS3へコピーし、成功したら1日以上経過したログファイルを削除する内容です。

# Copy log files to S3 with server-side encryption enabled.
# Then, if successful, delete log files that are older than a day.
LOG_DIR="/var/log/bastion/"
/usr/local/bin/aws s3 cp $LOG_DIR s3://bastion-logs/ --sse --region ap-northeast-1 --recursive && find $LOG_DIR* -mtime +1 -exec rm {} \;

 

シェルスクリプトを作成したら、cron登録をします。

chmod 700 /usr/bin/bastion/sync_s3
vim /etc/cron.d/bastion_log_sync_s3

 

/etc/cron.d/bastion_log_sync_s3

以下のcronを作成します。ここでは10分毎に実行する設定をしていますが、必要に応じて実行間隔は変更して下さい。

*/10 * * * * root /usr/bin/bastion/sync_s3

 

4. S3転送で必要なポリシーのアタッチ

EC2から、1で作成したS3バケット s3://bastion-logs へアクセスできるようにする必要があります。
EC2インスタンスのIAMロールに新規ポリシーを作成し、S3へのアクセス許可やS3 putを許可するポリシーを設定します。

 

 

5. S3にログが保管されていることを確認

S3にログファイルが保存されていることを確認します。念のため中身も確認し、実際のSSHセッション操作が記録されていることも確認しましょう。

 

以上で手順は終わりです。
うまく行かない場合は、/var/log/cron のログ確認や /usr/bin/bastion/sync_s3 を直接実行して問題が起きている箇所をチェックしてみてください。

 

 

コメント

* が付いている欄は必須項目です。