ちょっと話題の記事

[5分で]AWSベストプラクティスにのっとって踏み台(Bastion)サーバを構築する – Linux編 –

2016.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

(Windows編はこちら)

コンニチハ、千葉です。涼しくなってきたので、運動日和な今日このごろです。

さて今回は、Linux Bastion Hosts on the AWS Cloud: Quick Start Reference Deploymentが公開されていたので、あらためて踏み台サーバのベストプラクティスと提供されているCFnテンプレートでの構築をしてみました。踏み台サーバを利用すると、EC2インスタンスをインターネットに公開せずに、インスタンスに接続できるようになります。つまり、VPC内のサーバにセキュアにアクセスすることができるので利用する方がベターですね。

基本的な内容となっておりますので、初めての方などのお力になれば嬉しいです!

踏み台サーバのベストプラクティス

アーキテクチャ

AWSでセキュアにサーバへアクセスするために、踏み台サーバを構成するときのアーキテクチャです。

20160929-bastion-3

  • サブネットはマルチAZ構成
  • サブネットはパブリック用とプライベート用を2種類作成
  • パブリックサブネットにはインターネットゲートウェイをアタッチ
  • プライベートサブネットからインターネットへアウトバウンド通信を行いたい場合は、Managed NAT gatewayを構築する
  • 踏み台サーバは、2台用意しそれぞれのAZに配置、EIPをアタッチし、セキュリティグループにてパブリックサブネット、プライベートサブネットからのSSHアクセスを許可する
  • インターネットからアクセスを許可する場合は、0.0.0.0/0のような不特定多数からのアクセス許可ではなく、/32や特定のネットワーク帯に絞る

ベストプラクティス

ベストプラクティスです。

  • 踏み台は2つのAZに配置し、AZ障害発生時でも即座にアクセス可能にします
  • 踏み台はパブリックサブネットに配置する
  • 踏み台サーバーにはEIPをアタッチし、グローバルIPを固定化する。オンプレミスでのファイアウォールでの許可もできるようになる。
  • 特定のIPアドレスやCIDRからアクセスするように、踏み台専用のセキュリティグループを作成しアタッチします
  • 必要なアクセスのみ許可するように22番ポートのみを許可します

構築してみた

CFnテンプレートが用意されているため、こちらを利用します。CFnテンプレートは、2種類用意されています。

  1. VPC + EC2を作成
  2. 既存のVPCにEC2のみを作成

今回は2を利用しました。まず、踏み台構築対象のAWSアカウントにログインします。

こちらより、Launch Quick Start (for existing VPC)をクリックします。

リンクをクリックするとオレゴンリージョンになるので、展開したいリージョンを再度選択ください。

各項目を入力します。Enable BannerをTrueにするとログイン時にバナーを表示することができます。

20160929-bastion-1

EC2が2台起動しました。2台常時起動だとコストがかかるので、1台のみ起動しAZ障害発生時など適宜もう1台を起動するという方式のほうがよさそうです。

20160929-bastion-2

BastionにSSHでログインしてみました。バナーを有効化したのでバナーが表示されました。(バナー内容はカスタマイズ可能です)

###############################################################################
#     ___        ______     ___        _      _      ____  _             _    #
#    / \ \      / / ___|   / _ \ _   _(_) ___| | __ / ___|| |_ __ _ _ __| |_  #
#   / _ \ \ /\ / /\___ \  | | | | | | | |/ __| |/ / \___ \| __/ _` | '__| __| #
#  / ___ \ V  V /  ___) | | |_| | |_| | | (__|   <   ___) | || (_| | |  | |_  #
# /_/   \_\_/\_/  |____/   \__\_\\__,_|_|\___|_|\_\ |____/ \__\__,_|_|   \__| #
#-----------------------------------------------------------------------------#
#                           Authorized access only!                           #
#         Disconnect IMMEDIATELY if you are not an authorized user!!!         #
#                All actions will be monitored and recorded.                  #
###############################################################################

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

ログも記録されていました。

[root@ip-172-32-11-10 ~]# cat /var/log/bastion/bastion.log
ON: 2016年  9月 29日 木曜日 05:44:58 UTC   [FROM]:xxx.xxxx.xxx.xxx   [USER]:ec2-user   [PWD]:/home/ec2-user: ls
ON: 2016年  9月 29日 木曜日 05:44:58 UTC   [FROM]:xxx.xxxx.xxx.xxx   [USER]:ec2-user   [PWD]:/home/ec2-user: cat /var/log/messages
ON: Thu Sep 29 05:46:04 UTC 2016   [FROM]:   [USER]:root   [PWD]:/root: cat /var/log/messages

踏み台サーバのログ

/var/log/bastion/bastion.logにログが保存されます。日付, SSH接続元IP, ログインユーザー, working directory、全ての実行コマンドが残ります。

ログ例:

[root@ip-172-32-11-10 ~]# cat /var/log/bastion/bastion.log
ON: 2016年  9月 29日 木曜日 05:44:58 UTC   [FROM]:xxx.xxxx.xxx.xxx   [USER]:ec2-user   [PWD]:/home/ec2-user: ls
ON: 2016年  9月 29日 木曜日 05:44:58 UTC   [FROM]:xxx.xxxx.xxx.xxx   [USER]:ec2-user   [PWD]:/home/ec2-user: cat /var/log/messages
ON: Thu Sep 29 05:46:04 UTC 2016   [FROM]:   [USER]:root   [PWD]:/root: cat /var/log/messages

最後に

私も整理しながらこの内容を書いていたのですが、Bastion利用時にコマンドを記録しておくことは必要だなとあらためて認識しました。Linuxだけではなく、Windowsについても書くことを考えていますので、次回もお楽しみに!