AWSを真似てOracle Cloud Infrastructure(OCI) で簡易 踏み台サーバーを構築してみた1

# 今回の内容
Oracle Cloud InfrastructureのComputeにて、簡易的なBastionサーバーを構築してみたので、備忘録として書いておく。
参考URLとしては、AWSのBastionサーバー構築手順を参考にした。
[AWSのBastionサーバー構築方法](https://aws.amazon.com/jp/blogs/security/how-to-record-ssh-sessions-established-through-a-bastion-host/)


## 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ログイン時に強制的に実行される
<font color="Blue">/usr/bin/bastion/shell</font>
を作成する。この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](https://qiita.com/untitle_23/items/c7176e70ea2773a92de5)