這幾年 AWS 在 System Manager 耕耘了不少好用的功能,像是 Explorer, OpsCenter, Patch Manager, Inventory 等都是實務上對 Operation 有相當大的幫助,尤其是當企業擁有 ISO 認證時更是得力助手,詳細功能在其他篇幅再另外介紹,這篇會以 Session Manager 為主
Session Manager 是一項在 System Manager 的服務,一樣在講之前先放上 Session Manager 的文件,讓喜歡的人可以深入啃文件
以前曾寫過一篇「AWS 管理大量帳號時 Bastion 的設計與安全性」關於 Bastion 的議題討論,最近又和客戶討論到相同的問題,而 AWS System Manager 中的 Session Manager 又更進化了一些。
傳統使用 Bastion instance 的方式管理有幾項問題:
- 無法控管開放 SSH/22 的 0.0.0.0/0 的事情發生
- SSH Key 是否妥善保存
- 人員離職是否確實將 SSH Key 移除
這幾項在 ISO 的管理辦法都是重大缺失,通常在企業中很難容忍這類的事情發生,但又不好管理,而 Session Manager 算是把這些問題都解決
Session Manager 是一項 Server/Agent 架構的功能,必須透過在 Instance 安裝 SSM Agent 和 AWS System Manager 進行交互溝通,好在由 AWS 提供的 AMI 全部都有內建最新的 SSM Agent,所以只需要將 AmazonEC2RoleforSSM 這個 Managed Policy 掛給 Instance 就能使用 System Manager 的功能。
Session Manager of Security
以安全來說,Session Manager 是透過 IAM 控管權限,走 IAM 就更能擴充 像是 Active Directory (AD) 這類型的 Identity provider,而 IAM Role 更是 short-time 的安全做法
另外 Session Manager 也支援將 Terminal 的操作指令傳送到 S3 作為保存且 KMS 加密,對於 Security Audit 較為嚴格的企業而言,Session Manager 幾乎是不二首選。
Session Manager 是基於 Websocket 協定與 SSM Agent 將路打通,並不是真正走 SSH 登入,除了 Web Console 以外也支援 awscli 的方法登入,在這篇列出幾種登入情境:
AWS Console 登入 instance
最簡單的登入方法,符合以下就可以在 Console 看到註冊到 Session Manager 的 instances
- EC2 具有 AmazonEC2RoleforSSM 權限
- EC2 已經安裝 SSM Agent (AWS AMI 內建已有,若為自訂 AMI 必須安裝 SSM Agent)
- EC2 若是在 Private Subnet 必須建立 NAT Gateway 或 VPC Endpoint 讓 SSM Agent 傳回 SSM Service,另外 SSM Agent 也支援 Proxy 的方法。
SSM Agent 的版本更新速度頗快,通常是跟著 System Manager 的新功能走,若是版本太舊的 instance 也可以透過 Run command 自動更新 SSM Agent 版本,完全不需要手動更新。
透過 awscli 登入 instance
要走 awscli 的方法必須在 Client 端安裝 Session Manager Plugin,以 macOS 來說:
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
$ session-manager-plugin --version
1.1.61.0
最後執行 session-manager-plugin 確認可執行版本指令就完成
用 awscli 指定 instance-Id 就能登入
$ aws ssm start-session --target i-0306022909ea86a55
透過 ssh (awscli) 登入 instance
如果對於 ssh 使用依然習慣的使用者,利用 SSH ProxyCommand 做到 ssh 登入,只要在 ~/.ssh/config 加入以下:
# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
其實原理還是走 Websocket 只不過再疊一層 ssh,好處是 ssh 能做到的 tunnel, rsync, scp 都能使用,要用於傳輸檔案或是跨環境開發非常方便