要說明自動部署前我們應該要先說明怎麼好好保護我們的內網機器而說到內網機器就會說到我們的 Bastion Host,畢竟大家都不會想要我們的機器在外面裸奔吧 XD
所以在介紹自動部署之前我們先來介紹 Bastion Host 中文可能稱它為防禦主機
或是堡壘主機
一般來說比較偷懶的時候會在 Application 的 EC2 上面設定一個 Static IP 白名單 22 Port 來保護我們的機器而這其實不太安全,所以比較好的做法其實是設定一台 Bastion Host 來當我們的跳板機,所有的連線會經由這台跳板機連到內部的 private 網路主機,這其實是相對安全的一個方法,以架構來看我們會希望它是這個架構。
(圖片來源:AWS Security Blog)
而我們今天就要來教大家如何使用 CDK 架設一台 Bastion Host
不知道大家有沒有發現前幾天的教學文其實是在教大家如何建立自己的 Bastion Host,而 CDK 其實有一個簡單的 function 可以簡單的建立 Bastion Host
在這邊先把 SSH 開成 any 有需要設定 static ip 可以使用
host.allowSshAccessFrom(ec2.Peer.ipv4('192.192.192.192/32'));
這樣就不用寫昨天的一堆程式只要一行就可以達成拉!
const host = new ec2.BastionHostLinux(this, "BastionHost", {
vpc,
subnetSelection: { subnetType: ec2.SubnetType.PUBLIC },
});
host.allowSshAccessFrom(ec2.Peer.anyIpv4());
另外如果使用 Session Manager 連入 Bastion 其實可以更簡單的部署 Bastion,看起來是不是又更短了呢!
const host = new ec2.BastionHostLinux(this, "BastionHost", {
vpc,
});
相信大家平常習慣連接 EC2 Instance 機器方法是 SSH,而 Session Manager 也支援直接使用 SSH 的方法,在這裡我們可以使用工具 aws-ssm-ec2-proxy-command 來簡單達成此功能
~/.ssh/aws-ssm-ec2-proxy-command.sh
chmod +x ~/.ssh/aws-ssm-ec2-proxy-command.sh
編輯 ~/.ssh/config
加入
host i-* mi-*
IdentityFile ~/.ssh/id_rsa
ProxyCommand ~/.ssh/aws-ssm-ec2-proxy-command.sh %h %r %p ~/.ssh/id_rsa.pub
StrictHostKeyChecking no
如此我們就可以使用 ssh <INSTACEC_USER>@<INSTANCE_ID>
連接主機拉!
假設我們的機器 ID 是 i-0de45ffd579418348
就可以使用
$ ssh -A ec2-user@i-0de45ffd579418348
其實它與我們昨天教大家登入 SSM 指令最大的不同在於
aws ec2-instance-connect send-ssh-public-key \
--instance-id "$ec2_instance_id" \
--instance-os-user "$ssh_user" \
--ssh-public-key "file://$ssh_public_key_path" \
--availability-zone "$instance_availability_zone"
此指令會把我們設定的 ~/.ssh/id_rsa.pub
上傳上去主機裡面,所以當我們下次使用 SSH 指令的時候就可以直接登入主機啦!
預設設定 App Host 會放入本機的 SSH Key 並且只有 Bastion Host 可以連入,這樣我們就可以先跳到 Bastion Host 再連到 App Host 拉!
文章內容主要是網路或是程式開發類型的文章
本文同步刊載於 Clarence 部落格:Day 12 - 使用 CDK 部署 Bastion Host 防禦主機!
「AWS CDK 完全學習手冊:打造雲端基礎架構程式碼 IaC」
本書改編並延伸自第 12 屆 iT 邦幫忙鐵人賽獲得 DevOps 組冠軍的《用 CDK 定義 AWS 架構》系列文章,以簡單、好讀的行文風格詳述技術細節,並提供完整的程式碼範例與說明,一步一步帶領新手從零開始踏上 AWS CDK 技術達人之路。有興趣的朋友歡迎至天瓏書局選購!