今回の内容
Oracle Cloud InfrastructureのComputeにて、簡易的なBastionサーバーを構築してみたので、備忘録として書いておく。
参考URLとしては、AWSのBastionサーバー構築手順を参考にした。
AWSのBastionサーバー構築方法
AWSの手順と違う箇所
- ログはrootユーザーでしか確認できないように変更
- AllowTcpForwarding/X11Forwardingはyesのまま
- scriptコマンドでの時間表示せずに(tオプション)、各ユーザーのPS1に時間が表示されるように変更
- Object Storageにsshログの転送しない(簡易版のため、、、今後は要検討)
構築手順
1. ディレクトリ準備
下記のディレクトリの準備が必要
1-1. sshログ取得用コマンドの配置先
1-2. sshログの配置先
### 1-1. sshログ取得用コマンドの配置先
[opc@hostname ~]$ sudo mkdir -p /usr/bin/bastion
### 1-2. sshログの配置先
[opc@hostname ~]$ sudo mkdir -p /var/log/bastion
[opc@hostname ~]$ sudo chown root:root /var/log/bastion
[opc@hostname ~]$ sudo chmod 700 /var/log/bastion
2. コマンド準備
sshログイン時に強制的に実行される
/usr/bin/bastion/shell
を作成する。このscriptコマンドでsshログを取得する。
流れとしては以下の対応。
2-1. コマンドの作成
2-2. 実行権限付与
2-3. scriptコマンドにSUIDを設定
※上記はsshログがrootの所有物となるように設定
### 1. コマンドの作成
## catでファイル作成するために、一度rootになる
[opc@hostname ~]$ sudo su -
[root@hostname ~]#
[root@hostname ~]# cat > /usr/bin/bastion/shell << 'EOF'
# 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 _XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
# Wrap an interactive shell into "script" to record the SSH session
export PS1="[\u@\h \W][\d \t]\$ "
script -qf $LOG_DIR$LOG_FILE$SUFFIX.log
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
EOF
## opcユーザーに戻る
[root@hostname ~]# exit
[opc@hostname ~]$
### 2-2. 実行権限付与
[opc@hostname ~]$ sudo chmod a+x /usr/bin/bastion/shell
### 2-3. scriptコマンドにSUIDを設定
[opc@hostname ~]$ sudo chmod u+s /usr/bin/script
3. procfsの制限
procfsの制限を実施する。
流れとしては以下の対応。
3-1. hidepid=2でmountの実施
3-2. /etc/fstabの変更
### 3-1. hidepid=2でmountの実施
[opc@hostname ~]$ mount -o remount,rw,hidepid=2 /proc
[opc@hostname ~]$ grep "^proc" /etc/mtab
proc /proc proc rw,hidepid=2 0 0
# 上記のように表示されること
### 3-2. /etc/fstabの変更
[opc@hostname ~]$ sudo cp -p /etc/fstab /etc/fstab.`date "+%Y%m%d%H%M%S"`
[opc@hostname ~]$ sudo awk '!/proc/' /etc/fstab > temp && mv temp /etc/fstab
mv: `/etc/fstab' を上書きしてもよろしいですか(yes/no)? yes
# yesを入力する
4. sshdの修正と再起動
流れとしては以下の対応。
4-1. sshd_configの変更
4-2. sshdの再起動
### 4-1. sshd_configの変更
[opc@hostname ~]$ sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.`date "+%Y%m%d%H%M%S"`
[opc@hostname ~]$ sudo echo -e "\nForceCommand /usr/bin/bastion/shell" >> /etc/ssh/sshd_config
[opc@hostname ~]$ sudo tail -n 1 /etc/ssh/sshd_config
ForceCommand /usr/bin/bastion/shell
### 4-2. sshdの再起動
[opc@hostname ~]$ sudo service sshd restart
sshd を停止中: [ OK ]
sshd を起動中: [ OK ]
5. ユーザーの.bash_profile変更
各ユーザーの.bash_profileに
export PS1="[\u@\h \W][\d \t]$ "
を追加する
6. 確認
新たにteratermを起動してsshログが取得されていることを確認する。
※sshdの再起動をしたteratermはexitしないこと!誤っていた場合の対応が不可能になる。。
今後検討が必要な項目
/var/log/bastionディレクトリにログが取得されるため、ログのアーカイブの設計はちゃんと実施しないと、容量圧迫してしまうため注意が必要。
上記検討項目について、以下に記事作成。
AWSを真似てOracle Cloud Infrastructure(OCI) で簡易 踏み台サーバーを構築してみた2