#前提
AWS(プライベートサブネット)について学んだことを書いていきます。
#本題
#プライベートサブネット構築
いくら万全の対策をしていても、インターネットに接続している限りは、攻撃を受ける可能性が少なからずある。
そこでセキュリティを高める方法として検討したいのが、インターネットから隔離したプライベートサブネット。
データベースサーバーなどは、インターネットから隔離したプライベートサブネットに配置することで、安全性を高められる。
##プライベートサブネットの利点
パブリックサブネットは、インターネットゲートウェイを経由してインターネットに接続されている。
つまり、ここに配置したWebサーバーは、インターネットからSSHやWebブラウザでアクセスできる。
しかし、システムを構成するサーバー群の中には、インターネットから直接接続して欲しくないものもある。
例えば、データベースなどのバックエンドシステムは、その典型的な例。
隠したいサーバーは、インターネットから接続できないサブネットに配置するようにする。
このようなサブネットのことをプライベートサブネットと呼ぶ。
プライベートサブネットを構築することで、サーバーを隠すことができセキュリティを高められる。
##プライベートサブネットを作る
###アベイラビリティーゾーンを確認
リージョンとは、データセンター群が配置されている地域のことであり、それらのデータセンターを論理的にグループ化したものをアベイラビリティーゾーンと呼ぶ。
AWSのサービスは、いずれかのアベイラビリティーゾーン上で実行される。
VPCも例外ではない。
VPCを使ってサブネットを構築するとそのサブネットはどこかのアベイラビリティーゾーン上に作られる。
サブネット内に配置したインスタンスは、そのサブネットと同じアベイラビリティーゾーンに属する。
プライベートサブネットにはデータベースサーバーを置き、パブリックサブネットに存在するWebサーバーと通信するように構成する。
サブネットは別々のアベイラビリティーゾーンにあっても問題なく通信できる。
しかし、距離による遅延が増加したり、アベイラビリティーゾーン間の通信費用が発生したりするので注意する必要がある。
※それぞれのリージョンにいくつかのアベイラビリティーゾーンがあるのは、耐障害性を高めるため。
アベイラビリティーゾーン同士は、物理的に相当離れた場所に構築されており、異なるネットワークや電源網を用いていて、地震や洪水などで同時に影響を受けることがないように設計されている。
##プライベートサブネットにサーバーを構築する
プライベートサブネットができたら、サーバーを構築していきます。
・pingコマンドで疎通確認できるようにする
DBサーバーか、Webサーバーからアクセスできるかどうか確認する。
サーバー間での疎通を確認するときによく用いるのがpingコマンド。
pingコマンドでは、ICMP(Internet Control Message Protocol)と言うプロトコルを用いる。
pingコマンドを実行すると、ネットワーク疎通を確認したいホストに対してICMPエコー要求と言うパケットを送信する。
それを受け取ったホストは、送信元に対してICMPエコー応答というパケットを返信する。
pingコマンドでは、このICMPエコー要求とICMPエコー応答のやりとりから、疎通を確認したり相手に届くまでの時間を計測したりする。
・ICMPが通るように構成する
AWSのデフォルトのセキュリティグループの構成では、ICMPプロトコルは許可されていない。
※ファイアウォールには、インスタンスの外側から内側に流れる際に適用するインバウンドと、内側から外側に流れるアウトバウンドの2種類ある。
デフォルトでは、アウトバウンドには何ら通信制限がされていないため、何か通信を許可したいときには、インバウンドの方だけを調整すれば十分。
##踏み台サーバーを経由してSSHで接続
ここからSSHでログインし、MariaDBというデーターベースソフトをインストールする。
ここで一つ疑問がある。
DBサーバーはインターネットと接続されていないのにどうやってそこにSSHで接続すればいいか。
その解決方法の一つが踏み台サーバー。
WebサーバーにはSSHで接続できる。
そして、WebサーバーからDBサーバーには疎通確認がとれている。
そこで、❶WebサーバーにSSHでアクセス、❷WebサーバーからDBサーバーにSSHでアクセス、というようにWebサーバーを踏み台とすれば、ローカル環境からDBサーバーへとアクセスできる。
###秘密鍵のアップロード
インスタンスにSSHでアクセスするには、秘密鍵が必要。
つまり、WebサーバーからDBサーバーへとSSHで接続する場合、秘密鍵をWebサーバーに置いておく必要がある。
サーバーにファイルを転送するには、SCP(Secure Copy)というプロトコルを使う。
Macの場合は、ターミナルからscpコマンドを使ってファイルを転送する。
カレントディレクトリに置かれたmy-key.pemファイルを自分のホームディレクトリ(「〜/」)にコピーするには、下記のようにする。
$ scp -i my-key.pem my-key.pem ec2-user@ec2-18-177-32-60.ap-northeast-1.compute.amazonaws.com:~/
###WebサーバーからSSHで接続する
・鍵ファイルのパーミッションを変更
Webサーバーにログインしたら、まず秘密鍵ファイルのパーミッションを自分しか読めないように変更する。
そのためには、下記のコマンドを入力する。
$ chmod 400 my-key.pem
※この操作は、秘密鍵が見られると、誰もがサーバーにアクセスできてしまうので、それを防ぎ安全性を高めるのが狙い。
しかし、仮に安全性を気にしなくてもこの操作を省略できない。
自分だけが読み取れるというパーミッションになっていないと、sshコマンドを使って接続するときにエラーが表示されて接続できないから。
・Webサーバーを踏み台にしDBサーバーにSSH接続する
Webサーバーにログインしたら、DBサーバーに割り当てたプライベートIPアドレスである10.0.2.10に対してログインする。
$ ssh -i my-key.pem ec2-user@10.0.2.10
プライベートサブネットに置かれたサーバーにアクセスするときに、このようにインターネットから接続可能なサーバーにログインしてから、それを踏み台にしてログインすることが一般的。
#まとめ
インターネットから直接アクセスさせないプライベートサブネットの扱い方について書いていきました。
プライベートサブネットは、プライベートIPアドレスだけで構成したサブネットで、インターネットとの接続を持たない。
DBサーバーなど、インターネットから隠したいサーバー群を配置するときに用いる。
プライベートサブネットに設置したサーバーは、ローカル環境からアクセスできないためプライベートサブネットと通信可能な何らかのサーバーを踏み台にしてSSHでログインする。
この踏み台の方法を使えば、確かにローカル環境からサーバーへはアクセスできる。