Máy chủ Bastion: sử dụng chuyển tiếp TCP VS đặt khóa riêng trên máy chủ


10

Chúng tôi có máy chủ pháo đài B. Chúng tôi cần SSH từ A đến B đến C, sử dụng khóa riêng.

Lựa chọn tốt hơn là gì:

  • Đặt khóa SSH riêng trên máy chủ B. Chúng tôi đọc rằng đó là một ý tưởng tồi để làm điều đó trong môi trường sản xuất.

    Từ đây :

    Không bao giờ đặt các khóa riêng SSH của bạn vào ví dụ pháo đài. Thay vào đó, hãy sử dụng chuyển tiếp tác nhân SSH để kết nối đầu tiên với pháo đài và từ đó đến các phiên bản khác trong các mạng con riêng tư. Điều này cho phép bạn giữ khóa riêng SSH trên máy tính của mình.

  • Sử dụng chuyển tiếp đại lý SSH . Để thiết lập chuyển tiếp đại lý, tôi cần cho phép Chuyển tiếp TCP. Khi thiết lập chuyển tiếp tác nhân, một tệp ổ cắm được tạo trên máy chủ chuyển tiếp, đây là cơ chế mà khóa có thể được chuyển tiếp đến đích. Trong cài đặt Bastion tại AWS:

    Chuyển tiếp TCP: Đặt giá trị này thành true sẽ cho phép chuyển tiếp TCP (SSH đường hầm). Điều này có thể rất hữu ích nhưng nó cũng là một rủi ro bảo mật, vì vậy chúng tôi khuyên bạn nên giữ cài đặt mặc định (bị tắt) trừ khi được yêu cầu

    Cũng từ đây :

    Chuyển tiếp đại lý SSH được coi là có hại

Cái gì tốt hơn Điều gì về sự thay thế từ liên kết thứ hai: ProxyCommand , tôi hiểu nó giúp ích cho vấn đề tệp socket, nhưng tôi vẫn nghĩ rằng tôi phải kích hoạt chuyển tiếp TCP, vậy nó có đủ an toàn không?


2
Với ProxyCommand, bạn không cần bật chuyển tiếp TCP. Việc chuyển tiếp được thực hiện bởi ssh trên máy chủ trung gian.
wurtel

Cảm ơn. Các tập tin cấu hình nên được? trong máy tính của tôi hay trong Bastion?
dùng2503775

Trên hệ thống cục bộ của bạn, nơi bạn sẽ nhập ssh hostblệnh, để nó có thể tra cứu hostb trong cấu hình cục bộ và biết rằng nó cần kết nối thông qua hosta. Không thể làm điều đó nếu bạn đặt cấu hình trên
hosta

Trường hợp khóa riêng của máy chủ C sẽ được lưu trữ ở đâu? còn trong comp của tôi? Tôi đang sử dụng Keepass với keeAgent
user2503775

2
Tôi sợ bạn nhầm lẫn chuyển tiếp TCP với chuyển tiếp Đại lý . Chúng là những thứ khác nhau.
MLu

Câu trả lời:


13

Sử dụng ProxyCommand hoặc ProxyJump

Tôi sẽ khuyên bạn nên sử dụng ProxyCommand(hoặc thậm chí tốt hơn ProxyJumpvì cú pháp dễ hơn nhưng yêu cầu openssh 7.3+ tôi nghĩ ở phía máy khách) và bạn không cần phải triển khai khóa riêng trên Bastion, mọi thứ vẫn ở trạng thái cục bộ.

Ví dụ với ProxyJump

Trên máy khách của bạn, bạn viết một tệp ~/.ssh/configcó nội dung tương tự như dưới đây:

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

Sau đó, việc thực hiện ssh srvCsẽ kết nối bạn với C thông qua B (pháo đài) mà không cần Chuyển tiếp tác nhân cũng như không triển khai khóa riêng cho pháo đài.

Trong ví dụ trên, "bastion" là bí danh cho máy chủ Bastion của bạn và srvC là bí danh cho máy chủ của bạn C. Trong trường hợp HostNamebạn cần đặt IP hoặc tên miền đủ điều kiện thực sự cho máy chủ của mình. Đối với người dùng, bạn cần cập nhật Usertên đăng nhập chính xác trên Bastion và máy chủ C. Cuối cùng, đây IdentityFilelà tùy chọn nếu bạn sử dụng một tác nhân cục bộ (ví dụ: KeeAgent hoặc ssh-agent), nhưng nếu nó không chạy thì nó cũng sẽ làm việc và yêu cầu bạn cho từng cụm mật khẩu quan trọng.

Triển khai các khóa công khai

Tất nhiên bạn cần triển khai các khóa công khai cho cả pháo đài và srvC. Bạn có thể sử dụng (dấu $ chỉ để minh họa lời nhắc, không gõ nó):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

Lưu ý: ở trên sẽ chỉ hoạt động nếu xác thực mật khẩu vẫn được cho phép. Sau khi triển khai ở trên và xác minh rằng mọi thứ hoạt động như dự định, bạn nên không cho phép xác thực mật khẩu trên 2 máy chủ.

Ví dụ với ProxyCommand thay vì ProxyJump

Nếu bạn có phiên bản OpenSSH cũ hơn không hỗ trợ ProxyJump(về phía máy khách), thì hãy thay thế:

ProxyJump bastion

bởi

ProxyCommand ssh -q -W %h:%p bastion

Theo tôi hiểu, điều này là tương tự.


Cảm ơn bạn! Tôi làm việc với linux, nhưng chúng tôi có một số thành viên trong nhóm làm việc trên windows. Nó cũng nên hoạt động ở đó chứ?
dùng2503775

Họ sẽ sử dụng máy khách SSH nào? OpenSSH (thông qua WSL, hoặc cygwin hoặc v.v.) hoặc PuTTY (hoặc một công cụ khác dựa trên PuTTY) như MobaXterm?
Huygens

Một số người trong số họ sử dụng PuTTy và những người khác sử dụng ssh thông qua Git Shell.
dùng2503775

@ user2503775 Tôi chưa bao giờ thử nó với PuTTY, nhưng dường như có thể sử dụng phương pháp ProxyCommand, xem tại đây: stackoverflow.com/a/28937185
Huygens

1
Cảm ơn bạn rất nhiều vì câu trả lời chi tiết!
dùng2503775

5

Tôi đã thấy câu trả lời về ProxyJump. Hãy nói về ProxyCommand .

Nhưng chờ đã, đợi đã! Tôi có thể viết cho bạn cách hack máy chủ sử dụng chuyển tiếp Đại lý, điều đó sẽ dễ hiểu hơn nhiều về sự khác biệt!

Hãy hack!

Đối với các bước cơ bản: bạn có thể đọc bài viết của tôi ở đây

Các bước cơ bản như sau:

  1. Tạo người dùng pháo đài
  2. Vô hiệu hóa đăng nhập root
  3. Chặn các nỗ lực hack
  4. Thay đổi cổng
  5. Cấu hình tường lửa
  6. Định cấu hình SELinux

Cách sử dụng AgentForwarding

-Tạo cấu hình trong ~ / .ssh / config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

-Thêm khóa xác thực của bạn vào ssh-agent

ssh-add ~/.ssh/name_rsa

-Kết nối với pháo đài

ssh bast

-Kết nối máy chủ ứng dụng từ pháo đài

 ssh app@IP -p PORT

Hack!

Bạn có thể, tốt, hỏi tôi câu hỏi:

  • Máy chủ của tôi có an toàn không? Và câu trả lời khá đơn giản:

    • KHÔNG!
  • Tại sao?

    • Bởi vì bạn đang sử dụng chuyển tiếp SSH Agent!
  • Và vấn đề là ở đâu?

    • Bởi vì chuyển tiếp Đại lý là nguy hiểm và nó được coi là có hại.
  • Tại sao?

    • Hãy giải thích mọi thứ từ trong ra ngoài: Khi bạn kết nối máy chủ pháo đài, tác nhân ssh vinh quang của bạn được chuyển tiếp. Điều đó có nghĩa là ổ cắm sẽ được thiết lập để ai đó có thể sử dụng dữ liệu ổ cắm này để truy cập vào máy chủ của bạn. Hãy tưởng tượng rằng máy chủ pháo đài của bạn bị xâm phạm, Nếu ai đó có đủ quyền trên máy chủ Linux của bạn, anh ấy / cô ấy sẽ chỉ sử dụng thông tin ổ cắm của bạn. Kết quả là tất cả máy chủ của bạn có thể được truy cập. Tôi biết cửa sổ thỏa hiệp là rất nhỏ bởi vì nó phụ thuộc vào thời gian bạn được kết nối với máy chủ pháo đài. Nhưng bạn có thực sự muốn mạo hiểm khi bạn có các tùy chọn khác như ProxyCommand không? Do đó, chỉ cần sử dụng ProxyCommand!

Làm thế nào để hack máy chủ nếu bạn xâm phạm máy chủ pháo đài?

Theo dõi mục tiêu

Trong thư mục / tmp bạn có thể thấy một cái gì đó như thế:

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

Hãy mở tập tin tạm thời

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

Chúng ta hãy xem các kết nối đến id quá trình này.

netstat -nxp | grep  10507

kết quả:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

ai được kết nối?

lsof -i -a -p 10507

kết quả:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

Chúng tôi cũng có thể xem các tập tin ổ cắm:

cd /proc/10507/fd/
ls

kết quả:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

điều gì xảy ra khi máy khách sẽ được kết nối với máy chủ từ xa? hãy xem nào:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Chúng tôi thậm chí có thể xem nếu tập tin ổ cắm được sử dụng bằng netstat:

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

Ăn cắp thông tin ổ cắm và địa chỉ IP

Bây giờ chúng ta cần đánh cắp thông tin ổ cắm trong khi phiên của máy chủ pháo đài đang mở . Ồ, chúng tôi cũng cần IP máy chủ đích , vì vậy chỉ cần sử dụng netstat:

netstat -tn

Bước cuối cùng để sử dụng tệp ổ cắm được chuyển tiếp

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

Kiểm tra nếu khóa được tải .

ssh-add -l

kết quả sẽ là một cái gì đó như thế :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

Máy chủ bị hack, làm thế nào để khắc phục vấn đề bảo mật?

Lệnh proxy

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

Đối với các hoạt động cơ bản: cách chuyển tệp qua máy chủ (từ máy khách sang máy chủ, máy chủ sang máy khách), bạn có thể đọc bài đăng của tôi ở đây

Phần kết luận

  • Nếu bạn sử dụng máy chủ pháo đài, không sử dụng AgentForwarding mà sử dụng ProxyCommand
  • Luôn sử dụng người dùng không root để xác thực
  • Sử dụng tường lửa và chặn tất cả các kết nối không cần thiết.
  • Sử dụng SELinux (Nói chung)
  • Chặn địa chỉ IP, những người cố gắng đăng nhập nhiều lần với thông tin không chính xác
  • Nếu không cần thiết, đừng cấp quyền sudo cho người dùng
  • Giám sát máy chủ của bạn
  • Cập nhật máy chủ của bạn cho các bản vá bảo mật

Thêm thông tin, xem blog của tôi . Ngoài ra, tôi có một số ảnh chụp màn hình, vì vậy nó có thể hữu ích cho bạn.


Cảm ơn rât nhiều! Trên thực tế, chúng tôi cũng sử dụng google xác thực khi đăng nhập.
dùng2503775

Tôi đang gặp lỗi khi cố gắng gọi ứng dụng ssh : channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. . Bạn có một ý tưởng tại sao? Tại nhật ký an toàn tôi thấy:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
user2503775 17/03/19

Thông tin mát mẻ. Một lời khuyên nhỏ để cải thiện khả năng đọc câu trả lời của bạn. Không sao chép / dán nội dung blog của bạn ở đây. Cung cấp các liên kết và chỉ là một bản tóm tắt. Sau đó làm nổi bật phần câu trả lời thực (mà bạn đang sử dụng ProxyCommand). Tôi đã thấy bạn đã thử nó ngay từ đầu nhưng với phần sao chép / dán thì thật khó hiểu. Dù sao +1
Huygens

@ user2503775 Đây là một vấn đề khác, không liên quan đến lệnh chuyển tiếp / proxy ssh-agent. Hãy mở một câu hỏi mới với nhật ký.
grep


4

Đơn giản chỉ cần sử dụng chuyển tiếp đại lý SSH như hầu hết những người khác làm.

  • Các phím sẽ ở trong đại lý ssh trên máy tính xách tay của bạn.
  • Bạn đăng nhập vào pháo đài, xác thực thông qua các đại lý.
  • Từ đó đăng nhập vào máy chủ mục tiêu của bạn, với yêu cầu xác thực được chuyển tiếp trở lại máy tính xách tay của bạn .

Ưu điểm: không có khóa nào được lưu trữ trên pháo đài có thể bị sử dụng sai.

Mong rằng sẽ giúp :)


Xin chào, đó là cơ bản những gì OP mô tả trong viên đạn thứ hai của anh ấy / cô ấy. Tôi khuyên bạn nên kiểm tra liên kết thứ hai được cung cấp trong câu hỏi.
Huygens

@Huygens đúng tôi nhận thấy bây giờ. Tôi đã nói quá nhiều khi anh ấy kết hợp chuyển tiếp TCP với chuyển tiếp Đại lý.
MLu

Thật vậy, điều này được trộn lẫn :-)
Huygens

Nó không hỗn hợp. Tôi hiểu sự khác biệt. Tôi chỉnh sửa câu hỏi để làm cho nó rõ ràng.
dùng2503775

Tôi đã viết một câu trả lời, làm thế nào để hack chuyển tiếp đại lý (Không có khóa nhưng có ổ cắm mở). Nói chung, chuyển tiếp đại lý là ổn vì khả năng đánh cắp các khóa là rất thấp - trước hết, bạn phải hack máy chủ pháo đài. Dù sao bạn cũng có thể thấy câu trả lời của tôi: serverfault.com/a/958466/476642
grep
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.