AWS

外部に公開しているEC2サーバのセキュリティについて

個人で AWS を利用していると、なるべく月々の料金は抑えたくなりますよね。

職場でもテスト環境などは夜の 23 時以降にインスタンスを停止して、朝の 7 時くらいに起動するとか涙ぐましい努力をされている人もいると思います。

バッチ処理はインスタンスが起動している時間帯に動くように本番とは時間を変えて・・・。

個人の場合は別のアプローチとして、EC2 のインスタンス数を節約するという方法もあります。

今回はインスタンス数の節約と、その場合の最低限のセキュリティについて紹介してみたいと思います。

インスタンスの数

本来なら、Web サーバはプライベートなサブネットに置いて、踏み台サーバやゲートウェイ的なサーバをグローバルに置くのが理想です。

また、踏み台となるサーバも必要な時だけインスタンス起動し、接続元の IP アドレスも制限しておくとなおベターです。

しかし個人の場合、特に AWS を初めてお試しで使おうと思っている人には料金のことが気になって仕方ありません。

よってお試しの無料枠期間の内は、以下の構成をオススメしたいと思います。

無料枠オススメ構成

EC2:Web, CI
DB:RDS
Redis:ElastiCache
ログ、画像:S3

要するに、EC2 のインスタンスは 1 個でやってしまおうということです。

EC2のスペックと構成

EC2 の OS は AmazonLinux、インスタンスタイプは無料枠の t2.micro です。

CPU のコア数は 1 個で頼りないですが、これでも十分働いてくれます。

どちらかというと辛いのはメモリになります。たったの 1GB です。

Web サーバと CI を兼任することを考えると、メモリはもう少し欲しいところですので、苦肉の策でスワップメモリを 2GB 割り当てておきます。

っと書いているうちに、使用中のサーバがスワップを使ってる・・・。

ディスクは無料枠制限一杯の 30GB を SSD で割り当てておけば、一時的にログが増えても一安心です。

EC2へのリモート接続

踏み台サーバを経由しない場合、EC2 に対してコンソールで作業を行おうと思うと ssh で接続する必要があります。

使用する際にインスタンス起動するのであれば、セキュリティグループの設定で、都度 ssh のポートを IP 指定で開放すれば良さそうです。

ただ、24 時間サービスを続けている Web サーバの場合はそうはいきません。

よって、以下の設定を考えてみます。

sshとAWSの設定

sshのポート:22番以外
sshの認証:公開鍵
ユーザ:ec2-user以外
パスフレーズ:それなりにセキュアな文字列で設定する
rootのsshログイン許可:許可しない
セキュリティグループ:sshのポートを部分開放

部分開放と書いたのは、自宅や職場の IP アドレスが固定になっている場合や、範囲が決まっていれば指定するという意味です。

ただし、私は iPhone アプリの「Termius」で 4G(LTE)から利用することもあるので、全世界に開放しちゃってます。

日本国内やキャリア回線の IP アドレス帯域に限定するという考えもありますが、複数の範囲指定が必要だったり、キャリアのスマホの帯域が公開されていなかったりと難易度が高いので諦めました。

sshのセキュリティについて

上記のような ssh の設定の場合、リスクがどこまであるかを考えてみます。

リスク

ポートスキャンで空いているポートが特定される
sshのポートが狙い撃ちされる
認証が通らなくても負荷は与えられる

認証が通らない前提で考えると、上記のようなことが思い浮かびます。

そもそも公開鍵認証の場合、認証自体を通すことはハッカーやクラッカーの場合はどの程度簡単なのでしょうか。
(秘密鍵が漏洩していない状態と仮定します)

どちらかというと、他のポートや OS またはミドルウェアの脆弱性をついての侵入の方が可能性は高いのでしょうか。

AmazonLinuxで新しいユーザを作成してec2-userを削除するAmazonLinux ではデフォルトで ec2-user というユーザが作成されています。 これは AmazonLinux で EC...