LoginSignup
5
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-21

今回の内容

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2