SSH ForceCommand an toàn như thế nào trên máy chủ nhảy?


8

Tôi có các thiết lập sau trong mạng của mình:

Internet <--> Bastion <--> Local Network

Tôi có một vài người dùng và mỗi người dùng được gán cho một máy cụ thể. Hay nói cách khác: Mỗi người dùng chỉ phải truy cập vào một trong những máy chủ đó. Ví dụ: User1 -> Machine1, User2 -> Machine2, v.v.

Những người dùng đó sẽ kết nối từ bên ngoài mạng của tôi và tôi đã xem xét nhiều tùy chọn cách chuyển tiếp kết nối của họ qua máy chủ pháo đài của tôi đến mạng của tôi.

Cuối cùng, tôi đã chọn cho Match Blocks và forcecommand.

Vì vậy, / etc / ssh / sshd_config trên pháo đài của tôi trông như thế này:

Match User User1
        ForceCommand ssh User1@Machine1 $SSH_ORIGINAL_COMMAND

User1 kết nối với máy chủ pháo đài tự động thiết lập kết nối với Machine1.

Theo như tôi hiểu về ForceCommand, User1 sẽ không có quyền truy cập thực sự vào máy chủ pháo đài, bởi vì tất cả các hoạt động của anh ta sẽ được xử lý bởi khối khớp trước, do đó được định tuyến lại cho Machine1. Tuy nhiên điều này có thực sự đúng? Điều này đã đủ để là một thiết lập an toàn? Người dùng bị bỏ tù trên Machine1, vì vậy anh ta sẽ không có nhiều khả năng ở đó.


2
Hãy nhớ lấy IPv6, vì vậy bạn sẽ không cần thêm hộp nhảy.
Michael Hampton

Câu trả lời:


6

Cách tôi sử dụng máy chủ pháo đài đang sử dụng ProxyCommand-Wcờ như trong ví dụ này:

ssh -o ProxyCommand='ssh -W %h:%p user@bastion' user@machine

Tôi sử dụng phương pháp này vì lý do bảo mật. Giao tiếp giữa máy khách và máy đích được mã hóa và xác thực từ đầu đến cuối, có nghĩa là nó vẫn được bảo mật ngay cả khi pháo đài bị xâm phạm. Một máy chủ pháo đài bị xâm phạm sẽ cung cấp bảo mật không kém so với sử dụng ssh end-to-end mà không có pháo đài.

Nó cũng loại bỏ sự cần thiết phải sử dụng bất kỳ chuyển tiếp đại lý. Trước tiên, khách hàng có thể sử dụng xác thực dựa trên khóa để truy cập vào pháo đài và sau đó một lần nữa để truy cập máy chủ đích mà không cần cung cấp kết nối đại lý nào để lạm dụng khóa riêng có trên máy khách.

Nó cũng giới hạn mã tôi phụ thuộc vào máy chủ pháo đài. Tôi không cần phải thực hiện bất kỳ lệnh nào trên pháo đài. -Wngụ ý cờ không có lệnh cũng như một cổng chuyển tiếp duy nhất, chuyển tiếp cổng này là tất cả các máy chủ pháo đài cần phải cho phép.

Với cách tiếp cận này, tôi khuyên bạn nên khóa máy chủ pháo đài càng nhiều càng tốt, chỉ cho phép sử dụng các lệnh của cấu trúc trên.

Các ~/.ssh/authorized_keystập tin trên pháo đài có thể được sở hữu bởi root (như thể tất cả các thư mục trên đường đi từ thư mục gốc của hệ thống tập tin để nó), điều này làm giảm nguy cơ này có thể được sửa đổi thậm chí nếu ai đó cố đột nhập như người dùng không có đặc quyền trên chủ nhà pháo đài.

Trong authorized_keysđặc quyền của khách hàng có thể được hạn chế bằng cách sử dụng các tùy chọn command, no-agent-forwarding, no-pty, no-user-rc, no-X11-forwarding, cũng như sử dụng permitopenđể forwardings cổng giới hạn chỉ cho phép truy cập vào cổng 22 trên máy chủ mà thành viên này được phép truy cập.

Về nguyên tắc, phương pháp này sẽ an toàn ngay cả khi nhiều người dùng chia sẻ một tên người dùng trên pháo đài. Nhưng bạn có thể tách biệt hơn một chút bằng cách sử dụng tên người dùng riêng biệt trên pháo đài.


Có vẻ như bạn đang gọi nhị phân ssh tại pháo đài. Trong trường hợp này, nếu pháo đài bị xâm phạm, kẻ tấn công có thể thay thế nhị phân ssh này bằng một thứ sẽ làm mất liên lạc của bạn. Vì bạn không sử dụng đường dẫn trong dòng lệnh của mình (chẳng hạn như / usr / bin / ssh), kẻ tấn công có thể làm như vậy ngay cả khi không có quyền truy cập root trên pháo đài, bằng cách đặt nó vào thư mục nhà của bạn và thay đổi PATH (hoặc sử dụng bí danh ssh). Chỉ cần 2 xu của tôi.
George Y.

1
@GeorgeY. Bạn sai rồi. Cả hai sshlệnh đang chạy trên máy khách. Và đó chính xác là quan điểm của việc làm theo cách tôi đề xuất. Cách tiếp cận được đề cập trong câu hỏi sẽ chạy sshtrên pháo đài, mở ra một loạt các vectơ tấn công có thể.
kasperd

2

Bạn có thể dễ dàng phá vỡ ForceCommand vì nó khởi động khi shell của bạn bắt đầu. Điều này về cơ bản có nghĩa là tệp RC shell của bạn được xử lý trước và sau đó là ForceCommand nếu bạn cho phép nó đến đó. Đơn giản exec shtrong tệp RC shell của bạn sẽ sinh ra một shell khác và giữ ForceCommand chờ cho đến khi bạn thoát khỏi shell này.

Vì vậy, dòng dưới cùng; nếu người dùng bằng cách nào đó có thể chỉnh sửa RC shell của mình (giả sử .bashrc) thông qua ftp, sftp, scp hoặc một số cách khác, thì ForceCommand không thực sự là một cái gì đó để dựa vào.


Ok tôi sẽ thử nó. Không ai trong số những người dùng đó có quyền truy cập vào máy chủ pháo đài để thực hiện bất kỳ thay đổi tệp nào. Họ chỉ có quyền truy cập vào máy chủ đích nơi họ có thể thay đổi .bashrc. Nhưng tôi hy vọng tôi hiểu bạn đúng, rằng bạn có liên quan đến máy chủ pháo đài?
Dr.Elch

1
Đó chỉ là vấn đề nếu người dùng có thể đăng nhập vào hệ thống để thay đổi tệp bashrc. Nếu các tài khoản này không có ý định được sử dụng bình thường, thì chúng có thể được sở hữu bởi root, với thư mục và hầu hết tất cả các tệp thuộc sở hữu của root. Kiểm tra các quy tắc xung quanh quyền sở hữu các tệp .ssh, nhưng chắc chắn những thứ như .bashrc không cần phải ghi.
mc0e

Có @ Dr.Elch thực sự, tôi đã đề cập đến bảo mật trên máy chủ pháo đài. Bạn cũng có thể xem xét; chattr + i để đặt shell RC là bất biến và vô hiệu hóa người dùng thay đổi shell cho họ chọn làm tùy chọn.
Hrvoje Špoljar

1

Tôi tưởng tượng rằng hầu hết thời gian đều ổn, nhưng vấn đề với bảo mật là những điều chưa có ai nghĩ đến. Không có gì đảm bảo.

Ví dụ như trong một thời gian dài, không ai nghĩ quá nhiều về cách các chức năng có thể được tạo ra từ các biến môi trường trong bash, nhưng gần đây mọi người nhận ra rằng có thể bị phá hủy, và một trong những tác động đó là ForceCommand có thể được khắc phục (tại ít nhất là được thực hiện trong tệp ủy quyền) nếu trình bao của người dùng bị bash. Bash đã được sửa chữa và hy vọng phiên bản của bạn được cập nhật, nhưng những thứ như thế này xảy ra.

Tôi không hoàn toàn chắc chắn liệu việc xác định ForceCommand có thực sự giống như việc xác định các lệnh đó trong các tệp ủy quyền hay không. Tôi đã không nhìn kỹ điều đó.


0

Tạo .bashrcquyền sở hữu bởi root:usergrpnhưng sshd vẫn có thể đọc được khi người dùng đăng nhập. Đặt perm / chủ sở hữu trên $ HOME không cho phép tạo tệp mới bởi người dùng. Cách này kiểm soát root nội dung .bashrc, cho phép nó thực hiện những gì nó cần, nhưng bản thân người dùng không thể thay đổi các cài đặt đó hoặc quyền trên các tệp / thư mục gián tiếp cho phép họ thay đổi nội dung .bashrc.


Làm thế nào về việc không gán bất kỳ thư mục nhà nào cho người dùng đó trên máy chủ pháo đài?
Dr.Elch

Nơi nào bạn sẽ lưu trữ .bashrcvới các lệnh bạn muốn nó chạy sau đó?
Marcin

Trên máy chủ pháo đài, forcecommand chuyển tiếp kết nối đến máy chủ thực được xác định trong sshd_config. Do đó, tôi không cần chỉ định thêm bất kỳ lệnh nào trên máy chủ pháo đài đó, phải không?
Dr.Elch

0

Tôi có một ý tưởng khác. Đối với mỗi người dùng trên máy chủ pháo đài, bạn có thể xác định shell của họ trong / etc / passwd là tập lệnh bash chỉ chạy ssh user1 @ machine1, user2 @ machine2, v.v. Cách này sẽ đảm bảo rằng họ không có bất kỳ giá trị nào shell trên chính máy chủ và họ chỉ cần kết nối với máy mà họ nên kết nối.


Bạn đã thử điều này? Ý tưởng này xảy ra với tôi và tôi tự hỏi nó hoạt động tốt như thế nào.
William Pietri
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.