AWS 上可以建立自已的虛擬主機,也就是 EC2,但為了安全性等原因,所以通常會將 EC2 放置在私有網段 (Private Subnet),而會找一台主機放置在公開網段 (Public Subnet),這也是我們所說的 Bastion Host (防禦/堡壘主機),但這樣就沒有問題了嗎?其實還是有下列的問題。
可能遇到的問題:
1. Key Pair 的管理問題,由於 Key Pair 是以檔案的方式進行管理,所以當使用者離職後,就無法有效的管理。
2. 必須將 Bastion Host 放置於公開網段,而且需要開啟埠端口(RDP 3389/SSH 22)。
3. 無法稽核使有用者輸入過那些指令。
4. 不需要特別登入 AWS Console 即可進行連結。
5. 可以同時支援 Windows 與 Linux 的使用,這邊比較難的事,在 Session Manager 登入時只能透過文字介面與 PowerShell 的介面方式登入,但本篇我們會說明如何透過 Session Manager Port Forward 的功能達到圖型化介面 GUI 的方式進行登入。
由於目前已有許多的客戶已在透過 Systems Manager Session Manager 來當作連線的方式,所以接下來我們來說明該如何完成上述的項目,藉以達到一個遠端登入最好的管理方式。
1. 請先建立一個私有網段 (Private Subnet),也就是不要附加 Internet Gateway (IGW) 或 NAT 於 Route Table 中。
VPC with public and private subnets (NAT)
https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html
2. 由於在私有網段 (Private Subnet) ,所以必須建立相對應的 VPC Endpoint,請參考下列的文章,分別建立三個 VPC Endpoint。
- ssm.region.amazonaws.com
- ec2messages.region.amazonaws.com
- ssmmessages.region.amazonaws.com
上述前二個是 SSM 的必要條件,而第三個是當你要使用 SSM Session Manager 時,就一定要使用。
另外由於我們想將 Session Manager 的所有活動記錄,也就是使用者所有的輸入指令都記錄下來,所以我們要將 Session activity logs 全部放置在同一個 S3 中,然後可以再透過 Amazon Athena 進行查詢,藉以找出是否有人有輸入特殊指令,如刪除檔案、查看敏感檔案等。
另外由於 S3 的 endpoint 比較不同,所以最後,我們必須在 EC2 中的 Security Group 中特別設定加入一組 prefix list 這樣才可以正常的輸出 Session activity logs 到 S3 中。
Step 6: (Optional) Create a Virtual Private Cloud endpoint
https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html
3. 請先針對 Systems Manager 建立一個最小權限的 IAM role,藉以後續可以附加在 EC2 Instance 中。
IAM Policy: AmazonSSMManagedInstanceCore
另外由於上述的 Policy 不包含 S3,所以也請同時加上 S3 的權限,如果你想簡單化這部份,你也可以直接使用 IAM Role [AmazonEC2RoleforSSM] 即可,但如果想要細部設定只可以使用特定的 S3 時,即可參考下列的連結。
Step 4: Create an IAM instance profile for Systems Manager
https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-instance-profile.html
4. 上述的動作完成後,即已完成環境的設定,所以此時,請嘗試啟動一台 Windows EC2,並且在啟動的過程中,將你在步驟3建立的 IAM 給附加上。
注意,此部份你不需要開啟任何的 3389 port 或是 22 port,所以我的 inbound 是空白的,沒有新增開啟任何的規則。
5. 此時你可以先到 Systems Manager -> Fleet Manager 中確認你的主機是否已有顯示在清單中。
6. 此時你可以透過 EC2 中的 Connect -> Session Manger 進行連線,或是從 Systems Manager -> Session Manager 中進行連線,連線成功後,你會發現只有 PowerShell 的命令視窗,此時代表你已成功並且完成相關的設定。
7. 目前新功能上來說,也可以透過 Systems Manager -> Fleet Manager -> Node actions -> Connect with Remote Desktop 直接連接,但可惜這個方法目前無法使用剪貼簿導向,但可以看出在使用上已更加的方便了。
8. 接下來,我要說明如何透過 Systems Manager Session Manager 中的 Port Forwarding 的功能進行。
9. 請設定一個身份,可以執行 Session Manager 的動作,你也可以參考下列的文章。
Quickstart default IAM policies for Session Manager
10. 設定完成後,請完成安裝 AWS Command Line Interface (CLI) 與 Systems Manager CLI Extension,藉以可以啟動 Port Forwarding 的功能。
AWS Command Line Interface
(Optional) Install the Session Manager plugin for the AWS CLI
11. 安裝完成後,我們嘗試執行下列的指令,進行 Port Forwarding 的功能。
aws ssm start-session --target i-00e2a0ca3c861a3b5 --document-name AWS-StartPortForwardingSession --parameters '{"portNumber":["3389"], "localPortNumber":["9999"]}' --region ap-northeast-1
12. 最後,我們再透過 RDP Client 的軟體進行連線,你就會發現,可以在不開任何的 Port 的情況下,進行連線了。
13. 最後,我們要設定將所有的 Session Manager 的記錄輸出至 S3 中,所以請至 Systems Manager -> Preferences -> Edit