จำกัด การสำรองข้อมูลโดยไม่ใช้รหัสผ่านด้วย SFTP


11

ฉันต้องการสำรองข้อมูลเซิร์ฟเวอร์ไปยังคอมพิวเตอร์ของฉันโดยใช้ Duplicity:

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

ก่อนที่จะสามารถทำได้ฉันต้องอนุญาตการเข้าถึงรหัสผ่านโดยทำสิ่งต่อไปนี้:

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

คำถามของฉันคือฉันจะ จำกัด คำสั่งเฉพาะการถ่ายโอน SFTP นี้ในรหัสสาธารณะที่สร้างขึ้นได้อย่างไร

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

และเนื่องจากฉันอยู่ในที่อยู่ IP แบบไดนามิกฉันจะเอาชนะปัญหา "โฮสต์ที่ขาดหายไป" ปัญหาในแต่ละครั้งที่มีการเปลี่ยนแปลง IP ของฉันได้อย่างไร



1
"ไม่มีปัญหาโฮสต์ที่รู้จัก": ใช้ StrictHostKeyChecking = ไม่มีตัวเลือกในการ ssh
Marki

@ Marki ขอบคุณการตั้งค่าใน ssh_config ใช้งานได้
คำถามมากเกินไป

คำตอบ:


15

คำถามที่ 1

คำถามของฉันคือฉันจะ จำกัด คำสั่งเฉพาะการถ่ายโอน SFTP นี้ในรหัสสาธารณะที่สร้างขึ้นได้อย่างไร

มี 2 ​​วิธีในการทำเช่นนี้

1. - การ จำกัด ผ่าน sshd

วิธีนี้เกี่ยวข้องกับการตั้งค่าคุณสมบัติ SFTP ภายใน SSH daemon ของsshdคุณ สิ่งนี้ถูกควบคุมผ่าน/etc/ssh/sshd_configไฟล์กำหนดค่า หมายเหตุ:สิ่งนี้จะ จำกัด ผู้ใช้backupเพื่ออนุญาตให้ SFTP เข้าสู่เซิร์ฟเวอร์เท่านั้น

# /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. - การ จำกัด ผ่าน authorized_keys

วิธีนี้ไม่เกี่ยวข้องกับการเปลี่ยนแปลงใด ๆ กับsshd_configไฟล์ คุณสามารถ จำกัด ผู้ใช้ + คีย์ SSH ให้กับคำสั่งเดียวผ่านcommand=คุณสมบัติที่คุณได้กล่าวถึงไปแล้วในคำถามของคุณ เคล็ดลับอยู่ในสิ่งที่คุณรวมคำสั่ง คุณสามารถวางเซิร์ฟเวอร์ SFTP ในcommand=บรรทัดนี้ซึ่งมีผลเช่นเดียวกับการตั้งค่าเซิร์ฟเวอร์ SFTP ในsshd_configไฟล์ของคุณ

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

หมายเหตุ:หากผู้ใช้มีการเข้าถึงเพื่อเขียน ~/.ssh/authorized_keysพวกเขาสามารถอ่านและ / หรือแก้ไขได้ ตัวอย่างเช่นพวกเขาสามารถดาวน์โหลดแก้ไขและอัปโหลดซ้ำได้commmand=...โดยอนุญาตให้เขาเข้าถึงคำสั่งที่ไม่ได้กรองรวมถึงเชลล์ หากผู้ใช้มีสิทธิ์เข้าถึงเพื่อเขียน~/.sshพวกเขาสามารถยกเลิกการเชื่อมโยงและสร้างไฟล์ใหม่หรือchmodสร้างการเข้าถึงได้ มีวิธีแก้ปัญหาที่เป็นไปได้มากมายเช่นวาง~/.ssh/authorized_keysไฟล์ในที่ที่ผู้ใช้ไม่สามารถเขียนได้เช่นด้วย:

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

คำถาม # 2

และเนื่องจากฉันอยู่ในที่อยู่ IP แบบไดนามิกฉันจะเอาชนะปัญหา "โฮสต์ที่ขาดหายไป" ปัญหาในแต่ละครั้งที่มีการเปลี่ยนแปลง IP ของฉันได้อย่างไร

นี่เป็นเรื่องยาก แต่ทำได้โดยใช้from=คุณสมบัติภายในauthorized_keysไฟล์เช่นกัน ที่นี่เรา จำกัด การเข้าถึงจากโฮสต์เท่านั้น, somehost.dyndns.org.

จาก = "somehost.dyndns.org", คำสั่ง = "/ usr / libexec / openssh / sftp-server", ไม่มีการส่งต่อพอร์ต, ไม่มีการส่งต่อ X11, ไม่มีการส่งต่อเอเจนต์, no-pty ssh-dss AAAAC8ghi9ldw == backup @ host

การตั้งค่าเพิ่มเติมหลังจากนั้นcommand=มีความสำคัญเท่าเทียมกันเนื่องจากจะ จำกัด การใช้คีย์ SSH ยิ่งขึ้น

รายละเอียดของคุณสมบัติ

  • from='hostname1,hostname2,'' - จำกัด การเข้าถึงจาก IP หรือรูปแบบชื่อโฮสต์ที่ระบุ
  • command='command' - รันคำสั่งที่ระบุหลังจากการพิสูจน์ตัวตน
  • no-pty - ไม่จัดสรร pty (ไม่อนุญาตการล็อกอินแบบโต้ตอบ)
  • no-port-forwarding - ไม่อนุญาตให้ส่งต่อพอร์ต
  • no-X11-forwarding - ผู้ใช้จะไม่สามารถลบจอแสดงผล X11 GUIs
  • no-agent-forwarding - ผู้ใช้จะไม่สามารถส่งต่อผ่านโฮสต์นี้ไปยังโฮสต์ภายในอื่น ๆ

หากต้องการกำจัดข้อความเกี่ยวกับ "โฮสต์ที่ขาดหายไป" คุณสามารถเพิ่มตัวเลือก SSH นี้ให้กับลูกค้าเมื่อเชื่อมต่อดังนี้:

$ ssh -o StrictHostKeyChecking=no ....

ดู man page ssh_configสำหรับรายละเอียดทั้งหมดเกี่ยวกับสวิตช์นี้

การ จำกัด เปลือกของผู้ใช้

สำหรับโซลูชันทั้งสองข้างต้นคุณอาจต้องการล็อกbackupผู้ใช้โดย จำกัด เชลล์ของผู้ใช้รายนี้ใน/etc/passwdไฟล์ด้วย โดยทั่วไปแล้วคุณจะต้องการตั้งค่าเป็นscponlyแต่มีตัวเลือกอื่นสำหรับสิ่งนี้เช่นกัน ดูคำถาม & คำตอบ U & L นี้: " คุณต้องการกระสุนสำหรับ SCP หรือไม่ " เพื่อทำสิ่งนี้

การใช้/sbin/nologinยังสามารถใช้ถ้าคุณเลือกที่จะใช้คุณลักษณะ chroot จากsshd_configที่ระบุไว้ใน# 1ข้างต้น แต่ถ้าคุณเลือกที่จะใช้วิธีการที่ระบุไว้ใน# 2แล้วคุณมีแนวโน้มที่จะมีการใช้หรือสิ่งอื่นสำหรับเปลือกของผู้ใช้ในscponly/etc/passwd


โบนัส - ขยาย # 2 ด้านบน

หากคุณต้องการแสดงชุดคำสั่งสำหรับผู้ใช้รายนี้คุณสามารถทำได้ สร้างสคริปต์เช่น/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

จากนั้นคุณตั้งค่าauthorized_keysไฟล์ดังนี้:

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

backupจากนั้นผู้ใช้สามารถเรียกใช้คำสั่งเหล่านี้เพื่อต้องการ:

# 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

อ้างอิง


ระวังคำสั่งที่คุณอนุญาตให้ผู้ใช้เข้าถึงหรือผู้ใช้อาจมีความสามารถในการรับเชลล์เต็ม ตัวอย่างเช่นถ้าคุณให้ใครบางคนเข้าถึงเสียงเรียกเข้าพวกเขาสามารถทำได้ง่าย:! / bin / bash หรือ:! / bin / someotherprogram
rking

@rking - ใช่ว่าจะไปโดยไม่บอก ...
slm

ขอบคุณที่ให้คำตอบอย่างละเอียดกับฉัน การ จำกัด คำสั่งทำงานได้อย่างสมบูรณ์แบบ แต่มีสองปัญหา 1) dynamic ip หมายถึงคอมพิวเตอร์ของฉันไม่ใช่เซิร์ฟเวอร์ ชื่อโฮสต์ในฟิลด์ "จาก" ของไฟล์ authorized_keys จะ จำกัด ที่อยู่ที่เซิร์ฟเวอร์สามารถเข้าถึงคอมพิวเตอร์ของฉันและไม่ทำอะไรเลยเพื่อแก้ไขปัญหา "โฮสต์ที่ไม่รู้จัก" ในคอมพิวเตอร์ของฉัน 2) การปิดใช้งานการเข้าสู่ระบบเชลล์สำหรับผู้ใช้สำรองข้อมูลในคอมพิวเตอร์ของฉันด้วย/sbin/nologinจะป้องกันเซิร์ฟเวอร์จากการเข้าถึงคอมพิวเตอร์ของฉันด้วย SFTP ฉันพยายามอย่างนี้
คำถามมากเกิน

1
ขอโทษสำหรับความสับสน. เซิร์ฟเวอร์ S กลายเป็นไคลเอนต์เมื่อทำการเชื่อมต่อแบ็คเอนด์ SFTP กับคอมพิวเตอร์ของฉัน C. ปัญหา "โฮสต์ที่ขาดหายไป" เกิดขึ้นเมื่อใดก็ตามที่เซิร์ฟเวอร์ที่ทำการสำรองข้อมูลเชื่อมต่อไปยังตำแหน่งที่ไม่ได้ระบุไว้ในknown_hostsไฟล์ssh Marki ให้คำตอบที่ถูกต้องในความคิดเห็นของเขา fromพารามิเตอร์ในauthorized_keysแฟ้มบนคอมพิวเตอร์ของฉัน C เท่านั้น จำกัด สถานที่จากการที่ S สามารถเชื่อมต่อกับซี
คำถามล้น

ใช่โปรดดำเนินการแก้ไขต่อไป โดยวิธีการที่ฉันรู้ว่า/sbin/nologinทำงานถ้าฉันใช้คำสั่งบังคับinternal-sftpแทนที่/usr/libexec/openssh/sftp-serverคุณได้ระบุไว้ในใบรับรอง ฉันเดาว่านี่เป็นระบบย่อยสองระบบ และการสร้างไดเรกทอรี chroot สำหรับอดีตนั้นตรงไปข้างหน้ามากขึ้น
คำถามล้น

0

เชลล์ที่ จำกัด

คุณต้องกำหนดเชลล์ที่ จำกัด เช่นscponlyหรือrssh

เมื่อคุณใช้ scp หรือ sftp คุณกำลังเชื่อมต่อกับไซต์ระยะไกลผ่าน ssh และจากนั้นเชลล์ระยะไกลจะเรียกใช้กระบวนการ scp proccess หรือ sftp สิ่งที่คุณต้องการคือเชลล์แบบ จำกัด ที่อนุญาตเฉพาะ scp หรือ sftp เพื่อล็อคการล็อกอิน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.