มีวิธีการกำหนดค่าผู้ใช้ในกล่อง Linux (Centos 5.2 ในกรณีนี้) เพื่อให้พวกเขาสามารถใช้ scp เพื่อดึงไฟล์ แต่จริง ๆ แล้วไม่สามารถเข้าสู่เซิร์ฟเวอร์โดยใช้ SSH?
มีวิธีการกำหนดค่าผู้ใช้ในกล่อง Linux (Centos 5.2 ในกรณีนี้) เพื่อให้พวกเขาสามารถใช้ scp เพื่อดึงไฟล์ แต่จริง ๆ แล้วไม่สามารถเข้าสู่เซิร์ฟเวอร์โดยใช้ SSH?
คำตอบ:
rssh shell ( http://pizzashack.org/rssh/ ) ได้รับการออกแบบมาเพื่อวัตถุประสงค์นี้โดยเฉพาะ
เนื่องจาก RHEL / CentOS 5.2 ไม่มีแพ็คเกจสำหรับ rssh คุณอาจดูที่นี่เพื่อรับ RPM: http://dag.wieers.com/rpm/packages/rssh/
หากต้องการใช้งานให้ตั้งค่าเป็นเชลล์สำหรับผู้ใช้ใหม่เช่นนี้:
useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
.. หรือเปลี่ยนเชลล์สำหรับอันที่มีอยู่เช่นนี้
chsh -s /usr/bin/rssh scpuser1
.. และแก้ไข/etc/rssh.conf
เพื่อกำหนดค่าเชลล์ rssh - โดยเฉพาะอย่างยิ่งallowscp
บรรทัดที่ไม่ใส่เครื่องหมายข้อคิดเห็นเพื่อเปิดใช้งานการเข้าถึง SCP สำหรับผู้ใช้ rssh ทั้งหมด
(คุณอาจต้องการใช้ chroot เพื่อให้ผู้ใช้อยู่ในบ้าน แต่เป็นอีกเรื่องหนึ่ง)
ฉันมาสายนี้ แต่คุณสามารถใช้คีย์ ssh และระบุคำสั่งที่อนุญาตในไฟล์ ~ / .ssh / authorized_keys ของพวกเขาเช่น
ไม่มีการส่งต่อพอร์ต, no-pty, command = "scp source target" ssh-dss ...
คุณอาจต้องใช้ ps เป็นบนเป้าหมายเพื่อตั้งค่าคำสั่งที่เหมาะสม
PS: ถ้าคุณเรียกใช้คำสั่งทดสอบ scp ด้วย "-v" คุณสามารถเห็นสิ่งนี้
debug1: Sending command: scp -v -t myfile.txt
คุณจะทราบว่า "-t" เป็นตัวเลือก scp ที่ไม่มีเอกสารซึ่งใช้โดยโปรแกรมที่อยู่ไกลสุด สิ่งนี้จะช่วยให้คุณทราบถึงสิ่งที่คุณจำเป็นต้องใส่ใน authorized_keys
แก้ไข: คุณสามารถค้นหาข้อมูลเพิ่มเติม (มีหลายลิงค์) ในคำถาม StackOverflowนี้
นี่คือตัวอย่างการทำงานของสิ่งนี้สำหรับผู้ใช้ที่มีชื่อbackup_user
ในฝั่งเซิร์ฟเวอร์
~backup_user/.ssh/authorized_keys
เนื้อหาทางฝั่งเซิร์ฟเวอร์ (มีข้อ จำกัด ด้านความปลอดภัยเพิ่มเติม):
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
สร้างลิงก์ใน ~ backup_user / ที่ลิงก์ไปยังไดเรกทอรีที่ควรเข้าถึงเนื้อหา
$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
ตอนนี้จากฝั่งไคลเอ็นต์คำสั่งต่อไปนี้ควรใช้งานได้:
scp -v -r -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
คำสั่งนี้ทำอะไร:
-v
จากทั้งคำสั่งและไฟล์ authorized_keys)-r
ทั้งไฟล์คำสั่งและ authorized_keys หากคุณไม่ต้องการทำซ้ำแบบเรียกซ้ำ)-P 2222
จากคำสั่ง)-i .ssh/id_rsa_key_file
path/to/data
จะถูกคัดลอกไปยัง/path/to/directory/with/accessible/content/
ในการทำสำเนาไฟล์ (หรือหลาย ๆ ไฟล์) จากเซิร์ฟเวอร์ไปยังไคลเอนต์คุณควรสร้างเชลล์สคริปต์ที่จัดการสิ่งนี้ตามที่อธิบายไว้ที่นี่
chmod 400 ~/.ssh/authorized_keys
.
~/.bashrc
(และสิ่งอื่นใดที่ Bash ประหาร) และ~/.ssh/rc
อ่านอย่างเดียว แต่ถ้าผู้ใช้ที่เป็นอันตรายมีสิทธิ์เข้าถึง rsync หรือ sftp ผู้ใช้จะยังสามารถลบ~/.bashrc
และอัปโหลดใหม่ได้ เนื่องจากเป็นการป้องกันที่ยากฉันจึงแนะนำวิธีนี้ ( command="..."
)
ฉันมาช้าไปงานปาร์ตี้ แต่ฉันจะแนะนำให้คุณดูForceCommand
คำสั่งของ OpenSSH
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
ได้รับแล้วนี่คือ SFTP ไม่ใช่ SCP แต่ไปถึงเป้าหมายเดียวกันได้อย่างปลอดภัยกว่าด้วยกระสุน จำกัด นอกจากนี้คุณสามารถ chroot ผู้ใช้หากคุณต้องการ
chrootDirectory %h
และAllowTcpForwarding no
หลังการจับคู่เพื่อบังคับให้ผู้ใช้ sftponly chroot ไปที่บ้าน โปรดทราบว่าการจับคู่ควร (ต้อง!) เป็นส่วนสุดท้ายใน ssh config และตัวเลือกหลังจากนั้นเป็นตัวเลือกสำหรับผู้ใช้ที่ตรงกัน
ForceCommand internal-sftp -u 0077 -d /uploaddir
สามารถทำให้แข็งตัวได้ไกลขึ้นโดยบังคับให้ umask ในไดเรกทอรีอัปโหลด ร่วมกับ 'ChrootDirectory` มันสร้างสภาพแวดล้อมการอัพโหลดที่ควบคุมได้อย่างโดดเดี่ยว โบนัสหมายเหตุ: คุณต้องตั้งค่า dir เริ่มต้นและ umask ในForceCommand
, ไม่ใช่ในSubsystem
คำสั่งหากคุณต้องการให้มันทำงาน
ฉันขอแนะนำให้ใช้ scponly
มันเป็นเชลล์แบบ จำกัด ที่อนุญาตให้ผู้ใช้ทำสิ่งที่มันฟังดูเหมือนไฟล์ SCP ไปยังเซิร์ฟเวอร์ แต่ไม่ได้เข้าสู่ระบบจริง ๆ การดาวน์โหลดข้อมูลและซอร์สโค้ดของซอฟต์แวร์นั้นมีให้ที่นี่และแพ็คเกจ RPM ที่รวบรวมไว้ล่วงหน้ามีให้ผ่านทางEPEL YUM Repositories
เมื่อติดตั้งแล้วคุณจะต้องกำหนดค่าบัญชีผู้ใช้แต่ละบัญชีซึ่งคุณต้องการ จำกัด การเข้าถึงเพื่อใช้เชลล์ จำกัด ที่เพิ่งติดตั้งใหม่ คุณสามารถทำได้ด้วยตนเองผ่าน / etc / passwd หรือใช้คำสั่งต่อไปนี้: usermod -s /usr/bin/scponly USERNAME
scponly
ได้รับการออกแบบเพื่อวัตถุประสงค์นี้
ฉันใช้ MySecureShell เพื่อทำสิ่งนี้ คุณสามารถกำหนดค่าข้อ จำกัด อื่น ๆ ได้เช่นกัน
https://github.com/mysecureshell/mysecureshell
จำกัด การเชื่อมต่อกับ SFTP / SCP เท่านั้น ไม่มีการเข้าถึงเชลล์
ช้ามากไปงานปาร์ตี้ แต่เพียงตั้งค่าเปลือกของผู้ใช้ git เป็น / usr / bin / git-shell มันเป็นเชลล์ที่ถูก จำกัด ที่ไม่อนุญาตการล็อกอินแบบโต้ตอบ คุณยังสามารถเข้าสู่ผู้ใช้ด้วย 'su -s / bin / bash git' หรือชื่อผู้ใช้ git ของคุณคืออะไร
เราใช้เปลือก psudo ที่เรียกว่าscponlyบนเซิร์ฟเวอร์ ftp ที่ปลอดภัยของเราสำหรับผู้ใช้ที่เราต้องการจะสามารถ scp ไฟล์ แต่ไม่ได้เข้าสู่ระบบ
ฉันพบวิธีที่ดีคือการใช้คุณสมบัติ command = "... " ของไฟล์ authorized_keys ( หน้านี้แนะนำโดยฉัน)
คำสั่งที่คุณใช้จะเป็นคำสั่งที่ทดสอบอาร์กิวเมนต์ที่ขึ้นต้นด้วย scp (และ rsync)
นี่คือไฟล์ authorized_keys:
# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew
นี่คือเนื้อหาของ remote-cmd.sh:
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
ฉันเดาว่าคุณอาจจะยังคงต้องปกป้องไฟล์ authorized_keys ของผู้ใช้ แต่จุดประสงค์ของฉันคือมีรหัสผ่านที่ใช้ในการสำรองข้อมูลโดยไม่ต้องสร้างผู้ใช้ใหม่ทั้งหมดและไม่มีรหัสให้เชลล์ (ตกลงได้อย่างง่ายดาย)
~/.ssh/authorized_keys
, ~/.bashrc
(และสิ่งอื่นที่ทุบตีรัน) และ~/.ssh/rc
อ่านอย่างเดียวสำหรับผู้ใช้ แต่ถ้าผู้ใช้ที่เป็นอันตรายมีสิทธิ์เข้าถึง rsync หรือ sftp ผู้ใช้จะยังสามารถลบ~/.bashrc
และอัปโหลดใหม่ได้ เนื่องจากเป็นการป้องกันที่ยากฉันจึงแนะนำวิธีนี้ ( command="..."
)
เปลี่ยนล็อกอินเชลล์ของผู้ใช้เป็นสิ่งที่ จำกัด ซึ่งช่วยให้ผู้ใช้เรียกใช้เฉพาะscp , sftp-serverและrsyncเท่านั้นและยังตรวจสอบว่าไม่อนุญาตการขัดแย้งที่ไม่ปลอดภัย (เช่นscp -S ...และrsync -e .. .ไม่ปลอดภัยดูที่นี่: http://exploit-db.com/exploits/24795 ) ตัวอย่างสำหรับเชลล์ล็อกอินที่ จำกัด :
คุณอาจต้องการเรียกใช้หนึ่งใน chroot หรือในสภาพแวดล้อมที่ จำกัด อื่น (เช่นnsjailบน Linux) เพื่อปิดการเข้าถึงเครือข่ายและเพื่อการควบคุมที่ง่ายขึ้น (รายการที่อนุญาต) ของไดเรกทอรีที่สามารถอ่านและ / หรือเขียนได้
ผมไม่แนะนำให้ใช้command="..."
ใน~/.ssh/authorized_keys
เพราะไม่มีการป้องกันเพิ่มเติมระมัดระวัง (เช่นchmod -R u-w ~
สำหรับผู้ใช้) ผู้ใช้ที่เป็นอันตรายสามารถอัปโหลดเวอร์ชันใหม่ของ~/.ssh/authorized_keys
, ~/.ssh/rc
หรือ~/.bashrc
และทำให้สามารถรวมและรันคำสั่งโดยพลการ
ไม่ใช่โซลูชันที่สง่างามที่สุด แต่คุณสามารถโยนสิ่งนี้ลงในผู้ใช้. bashrc
if [ "$TERM" != "dumb" ]; then
exit
fi
ฉันพบว่าผู้ใช้ SCP ได้รับ 'ระยะเวลาโง่' และผู้อื่นจะได้รับ vt100
ฉันคิดว่าผู้ใช้อาจจะสแกนมากกว่า. bashrc ใหม่ซึ่งทำให้นี่ไม่ใช่ทางออกที่ดีที่สุด แต่สำหรับวิธีที่รวดเร็วและสกปรกวิธีนี้จะใช้ได้
~/.bashrc
) นอกจากนี้ยังเป็นขุยในแง่ที่ว่าอาจจะรุ่นใหม่ของ OpenSSH จะตั้งค่าTERM
ตัวแปรที่แตกต่างกันหรือการตั้งค่าบาง sshd TERM
การกำหนดค่าอาจส่งผลกระทบต่อ
ssh -o SetEnv TERM=dumb yourserver bash
??