1. Giới thiệu

Bastion Host là kỹ thuật giúp ta kết nối SSH một cách bảo mật vào các server nằm trong private subnet không có public IP.

Bối cảnh là bạn có private subnet chứa các private server, các private server này không thể truy cập từ ngoài internet và chúng cũng không có public IP. Bạn cần một phương pháp để kết nối SSH vào các server đó một cách bảo mật nhất.

Một trong những cách làm là sử dụng Bastion Host, bastion host là một server nằm trong public subnet, nhận kết nối SSH từ bên ngoài và làm trung gian kết nối với các server trong private subnet:

Bastion Host trong AWS

 

2. Tạo Bastion Host trong public subnet và private instace trong private subnet

Xem thêm về cách tạo public subnet và private subnet tại https://blog.daovanhung.com/post/tao-vpc-va-subnetting-trong-aws

2.1. Tạo Bastion Host trong public subnet

  • Bastion Host này sẽ nằm trong public subnet và có public IP:

Bastion host trong public subnet

 

  • Bastion Host phải cho phép kết nối SSH từ IP của máy muốn kết nối tới (để cho đơn giản mình dùng 0.0.0.0/0 là khắp nơi ngoài internet, bạn có thể thay thế bằng dải IP của máy bạn hoặc của công ty):

Tạo Bastion Host trong public subnet

 

Bạn cũng cần phải chú ý tới cấu hình cho Network ACL (xem thêm ở bài https://blog.daovanhung.com/post/tao-vpc-va-subnetting-trong-aws#2.5.-Tạo-Network-Access-Control-List-(Network-ACL)-cho-subnet)

 

2.2. Tạo private instance trong private subnet

  • Private Instance mình tạo sẽ không có public IP (chỉ có private IP) và không được kết nối từ internet:

Tạo private instance trong private subnet

 

  • Private Instance phải cho phép kết nối SSH từ và chỉ từ Bastion Host (IP mình khoanh đỏ là IP của Bastion Host):

Tạo private instance với bastion host

 

3. Kết nối tới private instance từ local

Từ local, để kết nối tới bastion host hay private instance, bạn cần private key của chúng, private key là pem file bạn tải về khi tạo EC2 instance.

Vì thế bastion host muốn kết nối SSH tới private instance thì bastion host cần phải có private key của private instance. Ta sẽ không lưu trữ private key của private instance trên bastion host mà sẽ dùng kỹ thuật ssh agent forwarding.

SSH agent forwarding giúp chúng ta kết nối SSH tới private instace thông qua bastion host mà không cần phải đặt private key lên bastion host.

Giả sử private key của mình là hungdv.pem file: 

3.1. Ở local máy bạn

Những câu lệnh dưới đây mình chạy trên Mac:

  • Thêm pem file vào session ssh:
$ ssh-add -K ~/.ssh/hungdv.pem
Identity added: /.ssh/hungdv.pem (/.ssh/hungdv.pem)
  • Kiểm tra xem đã thêm thành công chưa:
$ ssh-add -L
ssh-rsa abcxyz /.ssh/hungdv.pem
  • Kết nối tới bastion host và mang theo pem file:
$ ssh -A [email protected]
Last login: Tue Mar  2 14:38:12 2021 from ...

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-5-239 ~]$ 

 

3.2. Ở bastion host

Những câu lệnh dưới đây mình chạy trên linux (vì bastion host của mình là linux)

  • Kiểm tra xem private key có được mang lên từ local hay không:
[ec2-user@ip-172-31-5-239 ~]$ ssh-add -L
error fetching identities for protocol 1: agent refused operation
ssh-rsa abcxyz /.ssh/hungdv.pem
[ec2-user@ip-172-31-5-239 ~]$ 

Dòng báo lỗi error fetching identities for protocol 1: agent refused operation bạn có thể bỏ qua.

  • Kết nối tới private instance từ bastion host:
[ec2-user@ip-172-31-5-239 ~]$ ssh [email protected]
Last login: Tue Mar  2 14:42:28 2021 from ip-172-31-5-239.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-17-29 ~]$ 

 

Như bạn thấy, ta không cần phải tạo public IP cho private subnet cũng không cần mở cổng 22 cho internet mà vẫn có thể kết nối tới nó nhờ sử dụng Bastion host.

 

4. Một số lời khuyên khi sử dụng Bastion Host

  • Bastion Host là kỹ thuật chỉ sử dụng với kết nối SSH nên không cài đặt những thứ khác trên bastion host.
  • Không đặt private key trên bastion host mà nên sử dụng ssh agent forwarding.
  • Chú ý chịu tải cho bastion host.

 

Trên đây mình đã trình bày giải pháp sử dụng Bastion host để kết nối tới private server trong private subnet.

Thay vì sử dụng bastion host, bạn nên sử dụng system manager trong AWS. Với việc sử dụng system manager, bạn vẫn có thể kết nối tới private server mà không cần phải tạo server nằm giữa như bastion host, không cần mở cổng 22, cũng không cần phải quản lý private key.

Cách sử dụng system manager bạn xem ở bài https://blog.daovanhung.com/post/cach-su-dung-session-manager-mot-cach-bao-mat-trong-aws