Hạn chế sao lưu mật khẩu với SFTP


11

Tôi cần thực hiện sao lưu máy chủ vào máy tính của mình bằng Sao chép:

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

Trước khi điều này có thể được thực hiện, tôi cần cho phép truy cập không cần mật khẩu bằng cách làm như sau:

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

Câu hỏi của tôi là, làm cách nào để hạn chế lệnh chỉ chuyển SFTP này trong khóa chung được tạo?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

Và vì tôi đang ở trên một địa chỉ IP động, làm cách nào để khắc phục vấn đề "máy chủ bị thiếu đã biết" mỗi khi IP của tôi thay đổi?



1
"thiếu vấn đề máy chủ đã biết": sử dụng tùy chọn StricthostKeyChecking = no để ssh
Marki

@Marki, cảm ơn, cài đặt trên ssh_config hoạt động.
Câu hỏi tràn

Câu trả lời:


15

Câu hỏi 1

Câu hỏi của tôi là, làm cách nào để hạn chế lệnh chỉ chuyển SFTP này trong khóa chung được tạo?

Có 2 phương pháp để làm điều này.

1. - Hạn chế thông qua sshd

Phương pháp này liên quan đến việc thiết lập tính năng SFTP trong trình nền SSH của bạn , sshd. Điều này được kiểm soát thông qua các /etc/ssh/sshd_configtập tin cấu hình. LƯU Ý: Điều này sẽ hạn chế người dùng, backupchỉ được phép SFTP vào máy chủ.

# /etc/ssh/sshd_config

Subsystem       sftp    internal-sftp

## You want to put only certain users (i.e users who belongs to sftpusers 
## group) in the chroot jail environment. Add the following lines at the end 
## of /etc/ssh/sshd_config

Match User backup
  ForceCommand internal-sftp

2. - Hạn chế thông qua ủy quyền

Phương pháp này không liên quan đến bất kỳ thay đổi nào đối với sshd_configtệp. Bạn có thể giới hạn người dùng + khóa SSH chỉ bằng một lệnh thông qua command=tính năng mà bạn đã đề cập trong câu hỏi của mình. Bí quyết là trong những gì bạn bao gồm lệnh. Bạn có thể đặt máy chủ SFTP trong command=dòng này , có tác dụng tương tự như thiết lập máy chủ SFTP trong sshd_configtệp của bạn .

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

LƯU Ý: nếu người dùng có quyền ghi ~/.ssh/authorized_keys, họ có thể đọc và / hoặc sửa đổi nó. Ví dụ, họ có thể tải xuống nó, chỉnh sửa nó và tải lại nó tước đi commmand=..., cấp cho anh ta quyền truy cập lệnh không bị thay đổi, bao gồm cả vỏ. Nếu người dùng có quyền truy cập ghi ~/.ssh, họ cũng có thể chỉ cần hủy liên kết và tạo lại tệp hoặc chmodđể ghi quyền truy cập. Nhiều giải pháp có thể tồn tại, chẳng hạn như đặt các ~/.ssh/authorized_keystệp ở nơi không thể ghi được, chẳng hạn như:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Câu hỏi 2

Và vì tôi đang ở trên một địa chỉ IP động, làm cách nào để khắc phục vấn đề "máy chủ bị thiếu đã biết" mỗi khi IP của tôi thay đổi?

Điều này là khó khăn hơn nhưng cũng có thể sử dụng from=tính năng trong authorized_keystệp. Ở đây chúng tôi giới hạn truy cập chỉ từ máy chủ , somehost.dyndns.org.

từ = "somehost.dyndns.org", lệnh = "/ usr / libexec / openssh / sftp-server", không chuyển tiếp cổng, chuyển tiếp không X11, chuyển tiếp không đại lý, không pty ssh-dss AAAAC8ghi9ldw == sao lưu @ máy chủ

Các cài đặt bổ sung sau command=cũng quan trọng không kém, vì chúng sẽ giới hạn việc sử dụng khóa SSH hơn nữa.

sự cố

  • from='hostname1,hostname2,'' - Hạn chế quyền truy cập từ các mẫu IP hoặc tên máy chủ được chỉ định
  • command='command' - Chạy lệnh được chỉ định sau khi xác thực
  • no-pty - Không phân bổ một pty (không cho phép đăng nhập tương tác)
  • no-port-forwarding - Không cho phép chuyển tiếp cổng
  • no-X11-forwarding - người dùng sẽ không thể xóa GUI X11 hiển thị
  • no-agent-forwarding - người dùng sẽ không thể chuyển tiếp qua máy chủ này đến các máy chủ nội bộ khác

Để thoát khỏi thông báo về "máy chủ bị thiếu", bạn có thể thêm tùy chọn SSH này vào máy khách khi kết nối như vậy:

$ ssh -o StrictHostKeyChecking=no ....

Xem trang người đàn ông, ssh_configđể biết chi tiết đầy đủ về công tắc này.

Hạn chế trình bao của người dùng

Đối với cả hai giải pháp trên, bạn cũng có thể muốn khóa backupngười dùng bằng cách giới hạn trình bao của người dùng này trong /etc/passwdtệp. Thông thường bạn sẽ muốn đặt nó scponly, nhưng cũng có những lựa chọn khác cho việc này. Xem phần Hỏi & Đáp này của U & L có tiêu đề: " Bạn có cần vỏ cho SCP không? " Để biết cách thực hiện việc này.

Việc sử dụng /sbin/nologincũng có thể được sử dụng nếu bạn chọn sử dụng tính năng chroot từ sshd_confignhư được nêu trong mục số 1 ở trên. Tuy nhiên, nếu bạn chọn sử dụng phương pháp được nêu trong # 2 , thì bạn có thể sẽ phải sử dụng scponlyhoặc một cái gì đó khác cho trình bao của người dùng /etc/passwd.


THƯỞNG - Mở rộng số 2 ở trên

Nếu bạn cần để lộ một bộ lệnh cho người dùng này, bạn cũng có thể làm điều này. Tạo một kịch bản như vậy , /home/backup/commands.sh:

#!/bin/sh

case $SSH_ORIGINAL_COMMAND in
  "diskspace")
    df -h
    ;;
  "dirlist")
    ls -1
    ;;
  "apache_restart")
    /etc/init.d/apache restart
    ;;
  *)
    echo "Unknown command"
esac

Sau đó, bạn thiết lập authorized_keystệp như vậy:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

Sau đó, backupngười dùng có thể chạy các lệnh này như sau:

# diskspace
$ ssh -q user@remote_host diskspace
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/dev-root   39G  2.2G   35G   6% /

# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql

Người giới thiệu


Hãy cẩn thận với những lệnh bạn cho phép người dùng truy cập hoặc người dùng có thể có khả năng nhận được toàn bộ vỏ. Ví dụ: nếu bạn cấp cho ai đó quyền truy cập vào vim, họ có thể dễ dàng :! / Bin / bash hoặc :! / Bin / sometherprogram.
rking

@rking - vâng, không cần phải nói ...
slm

Cảm ơn đã cho tôi một câu trả lời chi tiết như vậy. Các hạn chế lệnh hoạt động hoàn hảo. Nhưng có hai vấn đề. 1) IP động đề cập đến máy tính của tôi, không phải máy chủ. Tên máy chủ trong trường "từ" của tệp ủy quyền chỉ giới hạn địa chỉ mà máy chủ có thể truy cập vào máy tính của tôi và không có gì để giải quyết vấn đề "máy chủ bị thiếu đã biết" trên máy tính của tôi. 2) Vô hiệu hóa đăng nhập shell cho người dùng sao lưu trên máy tính của tôi /sbin/nologinsẽ ngăn máy chủ truy cập vào máy tính của tôi bằng SFTP. Cái này tôi đã thử.
Câu hỏi tràn

1
Xin lỗi vì sự nhầm lẫn. Máy chủ S trở thành máy khách khi thực hiện kết nối SFTP phụ trợ với máy tính của tôi C. Sự cố "thiếu máy chủ đã biết" xảy ra bất cứ khi nào máy chủ S thực hiện sao lưu kết nối với một vị trí không được liệt kê trên known_hoststệp ssh của nó . Marki cung cấp giải pháp chính xác trong bình luận của mình. Các fromtham số trong các authorized_keystập tin trên máy tính của C tôi chỉ hạn chế vị trí mà từ đó S có thể kết nối với C.
Câu hỏi Overflow

Vâng, xin vui lòng đi trước để thực hiện chỉnh sửa. Bằng cách này, tôi nhận ra rằng nó /sbin/nologinhoạt động nếu tôi sử dụng lệnh lực lượng internal-sftpthay vì /usr/libexec/openssh/sftp-serverbạn đã chỉ định trên chứng chỉ. Tôi đoán đây là hai hệ thống con khác nhau. Và việc tạo một thư mục chroot cho trước đây là đơn giản hơn nhiều.
Câu hỏi tràn

0

Vỏ bị hạn chế

Bạn cần chỉ định một vỏ bị hạn chế như scponly hoặc rssh.

Khi bạn sử dụng scp hoặc sftp, bạn đang kết nối với trang web từ xa qua ssh và sau đó trình điều khiển từ xa thực thi quy trình xử lý scp hoặc sftp. Những gì bạn cần là một vỏ bị hạn chế chỉ cho phép scp hoặc sftp khóa khóa đăng nhập.

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.