Connect đến Private Server thông qua Session Manager

  • Chào các bạn, mình là Duy Nam Group 1 VTI Japan. Hôm nay mình xin được giới thiệu về việc Connect đến Private Server thông qua Session Manager

Background

  • Trong một số dự án yêu cầu security cao, các bạn sẽ không thể sử dụng Internet để connect được với Private Server của mình. Trong Best Practive của AWS họ sẽ tiến hành tạo một vài con Bastion Host, nơi các bạn có thể tiến hành SSH - Port Forwarding để đến với các server hay server endpoint mong muốn. Chúng ta có thể hiểu như hình bên dưới:
  • Tuy nhiên như trong hình các bạn thấy mình vẫn phải chuẩn bị một Internet Gateway phục vụ cho việc SSH từ nơi bạn làm việc đến AWS Cloud.
  • Do policy của dự án không được phép tạo Internet Gateway, vậy chúng ta phải làm sao để có thể SSH vào hệ thống để thao tác với các Private Server?

Solution

  • Để giải quyết vấn đề này AWS đã sinh ra một dịch vụ là Session Manager và bạn có thể login hay forward port vào trong bastion host để tiến hành công việc mà không cần đến Internet.
  • Ưu điểm:

    • Chúng ta có thể kết nối đến Bastion Host mà không cần đến Internet Gateway, không cần đến Public Subnet.
    • Chúng ta có thể tiến hành các công việc như Port Forwarding để kết nối với Database, WebApp Server ...
    • Chúng ta có thể kết nối với Windows Server qua RDP hay vào Linux server để chạy Command.
    • Về lý thuyết, connect đến Server vẫn thông qua Internet tuy nhiên chúng ta không sử dụng Internet Gateway mà đi qua cổng Internet của AWS và được AWS đảm bảo về Security cho việc login này.
  • Có một lưu ý là khi bạn login thông qua SSM, bạn sẽ dùng đến RBAC (Role Based Access Control), các bạn sẽ không dùng Security Group để giới hạn access đến Bastion Host mà thay vào đó bạn sẽ thông qua IAM Policy cấp phát cho IAM User.

Các yếu tố cần thiết để khởi tạo một session dựa trên Session Manager

1. Cài đặt AWS CLI vào máy thao tác của Developer

2. Tạo một IAM Policy tiến hành Switch Role với quyền start Session

  • Chúng ta tạo một Policy như bên dưới và tạo role tiến hành Switch Role:
    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ssm:*:*:document/AWS-StartPortForwardingSession"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:username}-*"
            ]
        }
    ]
    }

3. Cài đặt Session Manager Plugin vào máy thao tác của Developer

Ứng dụng của Session Manager

1. Khởi tạo Session để login vào Server

  • Sau khi cài đặt các thông tin bên trên chúng ta sẽ tiến hành lấy Instance ID của Bastion Host chúng ta muốn login vào (vd: i-08e54xxxxxxxxxx) và chạy Command dưới đây để login vào Bastion Host:

    aws ssm start-session --target i-08e54xxxxxxxxxx

2. Setting Port Forwarding qua Session Manager

  • VD: Khởi tạo Session để login vào Windows Server thông qua RDP Protocol

    aws ssm start-session --target i-08e54xxxxxxxxxx \
    --document-name AWS-StartPortForwardingSession \
    --parameter "localPortNumber=3389,portNumber=3389" \
    --region ap-northeast-1
    
    Starting session with SessionId: nam.nguyenduy-0eb48exxxxxxxxx
    Port 3389 opened for sessionId nam.nguyenduy-0eb48exxxxxxxxx.
    Waiting for connections...

3. Khởi tạo Session để xem được các web-site nội bộ hệ thống

  • Khởi tạo Session tiến hành forward port mà bạn mong muốn kết nối tới server

    aws ssm start-session --target i-08e54xxxxxxxxxx \
    --document-name AWS-StartPortForwardingSession \
    --parameter "localPortNumber=10022,portNumber=10022" \
    --region ap-northeast-1
  • Mở một terminate khác và tiến hành chạy port forwarding đến endpoint bạn mong muốn thông qua SSH

    ssh -i bastionHostKey.pem ec2-user@localhost -p 10022 -L 8443:${WEB_APP_ENDPOINT}:443
    • Chúng ta sẽ cần đến bastionHostKey.pem
    • ec2-user là user sử dụng bastionHostKey.pem
    • SSH thông qua địa chỉ localhost
    • 10022: địa chỉ port bạn chạy ở command bên trên
    • 8443: port bạn mong muốn xem ở local
    • WEB_APP_ENDPOINT: IP WebApp Server hoặc endpoint của WebApp Server
    • 443: port của WebApp Server
  • Sau khi chạy xong bạn có thể mở https://localhost:8443 để đến với server private từ máy local rồi

Kết luận:

  • Bài viết tuy ngắn nhưng hi vọng giúp các bạn hiểu thêm được một đường network để vào AWS không thông qua Internet.

Leave a Reply

Your email address will not be published. Required fields are marked *