TL; DR - đi đến cuối câu trả lời, "Áp dụng các hạn chế"
Thêm người dùng bị hạn chế bao gồm hai phần: 1. Tạo người dùng 2. Định cấu hình trình nền SSH (sshd)
Cấu hình sshd
Nơi tốt nhất để biết các khả năng của SSH là bằng cách đọc các trang hướng dẫn liên quan:
Máy khách SSH có thể thực hiện các hành động ở đâu?
Trước khi bạn có thể hạn chế một cái gì đó, bạn cần biết các tính năng của SSH. Nhổ qua các trang hướng dẫn mang lại:
- Thực thi lệnh Shell
- Tải tệp lên qua sftp
- Cổng chuyển tiếp
- Máy khách chuyển tiếp một cổng (un) đã sử dụng đến máy chủ
- Máy chủ chuyển tiếp cổng của mình đến máy khách
- Máy chủ chuyển tiếp một cổng của một máy chủ khác đến máy khách (proxy-ish)
- Chuyển tiếp X11 (chuyển tiếp hiển thị)
- Chuyển tiếp đại lý xác thực
- Chuyển tiếp thiết bị đường hầm
Từ phần Xác thực của trang hướng dẫn của sshd (8) :
Nếu khách hàng tự xác thực thành công, một hộp thoại để chuẩn bị phiên được nhập. Tại thời điểm này, khách hàng có thể yêu cầu những thứ như
phân bổ giả, chuyển tiếp kết nối X11, chuyển tiếp kết nối TCP hoặc chuyển tiếp kết nối tác nhân xác thực qua kênh bảo mật.
Sau này, máy khách yêu cầu shell hoặc thực thi lệnh . Các bên sau đó vào chế độ phiên. Trong chế độ này, một trong hai bên có thể gửi dữ liệu bất cứ lúc nào và dữ liệu đó được chuyển tiếp đến / từ trình bao hoặc lệnh ở phía máy chủ và thiết bị đầu cuối người dùng ở phía máy khách.
Tùy chọn để hạn chế các tính năng SSH
Các tệp và các tùy chọn thay đổi hành vi của chúng là:
~/.ssh/authorized_keys
- chứa các khóa được phép kết nối có thể được cung cấp tùy chọn:
command="command"
- Lệnh được cung cấp bởi người dùng (nếu có) bị bỏ qua. Lưu ý rằng máy khách có thể chỉ định chuyển tiếp TCP và / hoặc X11 trừ khi chúng bị cấm rõ ràng . Lưu ý rằng tùy chọn này áp dụng cho thực thi shell, lệnh hoặc hệ thống con.
no-agent-forwarding
- Cấm chuyển tiếp tác nhân xác thực khi khóa này được sử dụng để xác thực.
no-port-forwarding
- Cấm chuyển tiếp TCP khi khóa này được sử dụng để xác thực
no-X11-forwarding
- "Cấm chuyển tiếp X11 khi khóa này được sử dụng để xác thực."
permitopen="host:port"
- Hạn chế chuyển tiếp cổng 'ssh -L' cục bộ sao cho nó chỉ có thể kết nối với máy chủ và cổng được chỉ định.
~/.ssh/environment
- Tập tin này được đọc vào môi trường lúc đăng nhập (nếu nó tồn tại). Xử lý môi trường bị tắt theo mặc định và được kiểm soát thông qua tùy chọn PermitUserEn Môi trường
~/.ssh/rc
- Chứa các thói quen khởi tạo được chạy trước khi thư mục chính của người dùng có thể truy cập được.
/etc/ssh/sshd_config
- tệp cấu hình toàn hệ thống
AllowAgentForwarding
- Chỉ định xem chuyển tiếp ssh-agent (1) có được phép hay không.
AllowTcpForwarding
ForceCommand
- "Buộc thực thi lệnh được chỉ định bởi ForceCommand, bỏ qua mọi lệnh do khách hàng cung cấp và ~ / .ssh / rc nếu có. Lệnh được gọi bằng cách sử dụng trình đăng nhập của người dùng với tùy chọn -c."
GatewayPorts
- "Chỉ định xem các máy chủ từ xa có được phép kết nối với các cổng được chuyển tiếp cho máy khách hay không. Theo mặc định, sshd (8) liên kết các chuyển tiếp cổng từ xa đến địa chỉ loopback. Điều này ngăn các máy chủ từ xa khác kết nối với các cổng chuyển tiếp. sshd đó sẽ cho phép các chuyển tiếp cổng từ xa liên kết với các địa chỉ không loopback, do đó cho phép các máy chủ khác kết nối. "
PermitOpen
:
Chỉ định các đích mà chuyển tiếp cổng TCP được phép. Đặc tả chuyển tiếp phải là một trong các hình thức sau:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
Nhiều chuyển tiếp có thể được chỉ định bằng cách tách chúng với khoảng trắng. Một đối số 'bất kỳ' có thể được sử dụng để loại bỏ tất cả các hạn chế và cho phép mọi yêu cầu chuyển tiếp. Theo mặc định, tất cả các yêu cầu chuyển tiếp cổng được cho phép.
PermitTunnel
- Chỉ định xem có cho phép chuyển tiếp thiết bị tun (4) hay không. Mặc định là 'không'
X11Forwarding
- Chỉ định xem chuyển tiếp X11 có được phép hay không. Mặc định là 'không'
Áp dụng các hạn chế
Sửa đổi tệp cấu hình trên toàn hệ thống /etc/ssh/sshd_config
cho phép cấu hình được áp dụng ngay cả khi xác thực dựa trên mật khẩu được áp dụng hoặc nếu các hạn chế trong ~/.ssh/authorized_keys
vô tình bị xóa. Nếu bạn đã sửa đổi mặc định toàn cầu, bạn nên bỏ ghi chú các tùy chọn tương ứng.
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
Bây giờ thêm người dùng:
sudo useradd -m limited-user
Tùy chọn ForceCommand
có thể được bỏ qua nếu shell được đặt thành không phải shell như /bin/false
(hoặc /bin/true
) vì /bin/false -c [command]
sẽ không làm gì cả.
Bây giờ, máy khách chỉ có thể kết nối với cổng 62222 trên địa chỉ loopback của máy chủ qua SSH (nó sẽ không nghe trên địa chỉ IP công cộng)
Vô hiệu hóa AllowTcpForwarding
cũng sẽ không cho phép sử dụng -R
, do đó đánh bại việc sử dụng tài khoản bị hạn chế như vậy để chuyển tiếp một cổng. PermitOpen localhost:62222
giả định rằng cổng 62222 trên máy chủ không bao giờ được sử dụng vì máy khách có thể vui vẻ kết nối với nó và cũng lắng nghe nó.
Nếu chuyển tiếp TCP được cho phép trong cấu hình toàn hệ thống và xác thực dựa trên mật khẩu bị vô hiệu hóa, bạn cũng có thể sử dụng cài đặt theo từng khóa. Chỉnh sửa ~/.ssh/authorized_keys
và thêm các tùy chọn tiếp theo trước ssh-
(với khoảng trắng giữa các tùy chọn và ssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
Kiểm chứng
Để chắc chắn rằng nó hoạt động như mong đợi, một số trường hợp thử nghiệm cần phải được chạy. Trong các lệnh dưới đây, host
nên được thay thế bằng thông tin đăng nhập thực tế nếu nó không được đặt ~/.ssh/config
. Đằng sau lệnh, một lệnh được hiển thị nên được thực thi trên máy khách hoặc máy chủ (như được chỉ định).
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
Phần kết luận
Danh sách kiểm tra: Người dùng SSH không thể:
- thực hiện các lệnh shell - thực hiện
- truy cập tệp hoặc tải tệp lên máy chủ - xong
- sử dụng máy chủ làm proxy (ví dụ: webproxy) - xong
- truy cập các dịch vụ cục bộ không thể truy cập công khai do tường lửa - một phần , máy khách không thể truy cập các cổng khác ngoài 62222, nhưng có thể lắng nghe và kết nối với cổng 62222 trên máy chủ
- giết máy chủ - xong
(lưu ý rằng các kiểm tra này được giới hạn ở máy chủ SSH. Nếu bạn có một dịch vụ dễ bị tổn thương khác trên máy, nó có thể cho phép kẻ tấn công có thể chạy lệnh, giết máy chủ, v.v.)