อนุญาตให้ SCP แต่ไม่ใช่การลงชื่อเข้าใช้จริงโดยใช้ SSH


62

มีวิธีการกำหนดค่าผู้ใช้ในกล่อง Linux (Centos 5.2 ในกรณีนี้) เพื่อให้พวกเขาสามารถใช้ scp เพื่อดึงไฟล์ แต่จริง ๆ แล้วไม่สามารถเข้าสู่เซิร์ฟเวอร์โดยใช้ SSH?


ฉันพยายามตั้งค่าล็อกอินเชลล์เป็น / bin / false แต่นั่นก็แค่หยุดการทำงานของ scp โดยสิ้นเชิง
DrStalker

คำตอบ:


44

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 เพื่อให้ผู้ใช้อยู่ในบ้าน แต่เป็นอีกเรื่องหนึ่ง)


มันยอดเยี่ยมมาก - ฉันกำลังมองหาบางสิ่งเช่นนี้มาระยะหนึ่งแล้วเช่นกัน
วอร์เรน

6
ความคิดที่อยู่เบื้องหลัง rssh นั้นดี แต่ iirc rssh ไม่ได้เป็นความมหัศจรรย์ของความปลอดภัยในแง่ของการเขียนโปรแกรม ของ Google ง่ายใน 'rssh ใช้ประโยชน์จาก' ให้ผลลัพธ์ที่มากกว่าผมสบายกับ ...
wzzrd

7
scponly มากหรือน้อยเหมือนกันและเห็นได้ชัดว่ามีช่องโหว่ - sublimation.org/scponly/wiki/index.php/Main_Page
François Feugeas

scponly ได้ย้ายไปที่ github การเชื่อมโยงการระเหิดจะตาย github.com/scponly/scponly/wiki
spazm

38

ฉันมาสายนี้ แต่คุณสามารถใช้คีย์ 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

คำสั่งนี้ทำอะไร:

  • มันแสดงข้อมูล verbose (ตัวเลือกNal : คุณสามารถลบออก-vจากทั้งคำสั่งและไฟล์ authorized_keys)
  • มันจะคัดลอกเนื้อหาซ้ำของพา ธ / ไปยัง / ข้อมูล ( optionnal : คุณสามารถลบ-rทั้งไฟล์คำสั่งและ authorized_keys หากคุณไม่ต้องการทำซ้ำแบบเรียกซ้ำ)
  • มันใช้พอร์ต 2222 เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ (ตัวเลือก : คุณสามารถลบออก-P 2222จากคำสั่ง)
  • มันใช้และไฟล์ข้อมูลประจำตัวเพื่อทำการเชื่อมต่ออัตโนมัติ (ตัวเลือก : คุณสามารถลบได้-i .ssh/id_rsa_key_file
  • เนื้อหาของpath/to/dataจะถูกคัดลอกไปยัง/path/to/directory/with/accessible/content/

ในการทำสำเนาไฟล์ (หรือหลาย ๆ ไฟล์) จากเซิร์ฟเวอร์ไปยังไคลเอนต์คุณควรสร้างเชลล์สคริปต์ที่จัดการสิ่งนี้ตามที่อธิบายไว้ที่นี่


1
สิ่งที่จะหยุดผู้ใช้สแกนไฟล์ที่ได้รับอนุญาตของพวกเขา จะถูก จำกัด ไม่ให้ผู้ใช้เป็นเจ้าของด้วยตนเองได้หรือไม่?
ด่าน

1
@Dan - เป็นไปได้ที่จะตั้งค่าการอนุญาตให้อ่านอย่างเดียวในไฟล์ authorized_keys เช่น chmod 400 ~/.ssh/authorized_keys.
Roger Dueck

นอกจากนี้คุณควรสร้าง~/.bashrc(และสิ่งอื่นใดที่ Bash ประหาร) และ~/.ssh/rcอ่านอย่างเดียว แต่ถ้าผู้ใช้ที่เป็นอันตรายมีสิทธิ์เข้าถึง rsync หรือ sftp ผู้ใช้จะยังสามารถลบ~/.bashrcและอัปโหลดใหม่ได้ เนื่องจากเป็นการป้องกันที่ยากฉันจึงแนะนำวิธีนี้ ( command="...")
pts

31

ฉันมาช้าไปงานปาร์ตี้ แต่ฉันจะแนะนำให้คุณดูForceCommandคำสั่งของ OpenSSH

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

ได้รับแล้วนี่คือ SFTP ไม่ใช่ SCP แต่ไปถึงเป้าหมายเดียวกันได้อย่างปลอดภัยกว่าด้วยกระสุน จำกัด นอกจากนี้คุณสามารถ chroot ผู้ใช้หากคุณต้องการ


2
เพิ่มส่วนchrootDirectory %hและAllowTcpForwarding no หลังการจับคู่เพื่อบังคับให้ผู้ใช้ sftponly chroot ไปที่บ้าน โปรดทราบว่าการจับคู่ควร (ต้อง!) เป็นส่วนสุดท้ายใน ssh config และตัวเลือกหลังจากนั้นเป็นตัวเลือกสำหรับผู้ใช้ที่ตรงกัน
higuita

4
ForceCommand internal-sftp -u 0077 -d /uploaddirสามารถทำให้แข็งตัวได้ไกลขึ้นโดยบังคับให้ umask ในไดเรกทอรีอัปโหลด ร่วมกับ 'ChrootDirectory` มันสร้างสภาพแวดล้อมการอัพโหลดที่ควบคุมได้อย่างโดดเดี่ยว โบนัสหมายเหตุ: คุณต้องตั้งค่า dir เริ่มต้นและ umask ในForceCommand, ไม่ใช่ในSubsystemคำสั่งหากคุณต้องการให้มันทำงาน
Marcin

บทความยาว ๆ ที่อธิบายสิ่งนี้สามารถอ่านได้ที่debian-administr.org/article/590/…
koppor

7

ฉันขอแนะนำให้ใช้ scponly

มันเป็นเชลล์แบบ จำกัด ที่อนุญาตให้ผู้ใช้ทำสิ่งที่มันฟังดูเหมือนไฟล์ SCP ไปยังเซิร์ฟเวอร์ แต่ไม่ได้เข้าสู่ระบบจริง ๆ การดาวน์โหลดข้อมูลและซอร์สโค้ดของซอฟต์แวร์นั้นมีให้ที่นี่และแพ็คเกจ RPM ที่รวบรวมไว้ล่วงหน้ามีให้ผ่านทางEPEL YUM Repositories

เมื่อติดตั้งแล้วคุณจะต้องกำหนดค่าบัญชีผู้ใช้แต่ละบัญชีซึ่งคุณต้องการ จำกัด การเข้าถึงเพื่อใช้เชลล์ จำกัด ที่เพิ่งติดตั้งใหม่ คุณสามารถทำได้ด้วยตนเองผ่าน / etc / passwd หรือใช้คำสั่งต่อไปนี้: usermod -s /usr/bin/scponly USERNAME


ฉันที่สองนี้ scponlyได้รับการออกแบบเพื่อวัตถุประสงค์นี้
UtahJarhead

1
scponly ดูเหมือนว่าจะตาย เดเบียนดูเหมือนว่าจะลบมันออกมา: packages.debian.org/search?keywords=scponlyและโค้ดบน githubก็ตายเช่นกัน การสนทนาติดตามผล: serverfault.com/questions/726519/…
koppor

6

ฉันใช้ MySecureShell เพื่อทำสิ่งนี้ คุณสามารถกำหนดค่าข้อ จำกัด อื่น ๆ ได้เช่นกัน

https://github.com/mysecureshell/mysecureshell

จำกัด การเชื่อมต่อกับ SFTP / SCP เท่านั้น ไม่มีการเข้าถึงเชลล์


3

ช้ามากไปงานปาร์ตี้ แต่เพียงตั้งค่าเปลือกของผู้ใช้ git เป็น / usr / bin / git-shell มันเป็นเชลล์ที่ถูก จำกัด ที่ไม่อนุญาตการล็อกอินแบบโต้ตอบ คุณยังสามารถเข้าสู่ผู้ใช้ด้วย 'su -s / bin / bash git' หรือชื่อผู้ใช้ git ของคุณคืออะไร


2

เราใช้เปลือก psudo ที่เรียกว่าscponlyบนเซิร์ฟเวอร์ ftp ที่ปลอดภัยของเราสำหรับผู้ใช้ที่เราต้องการจะสามารถ scp ไฟล์ แต่ไม่ได้เข้าสู่ระบบ


2

ฉันพบวิธีที่ดีคือการใช้คุณสมบัติ 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 ของผู้ใช้ แต่จุดประสงค์ของฉันคือมีรหัสผ่านที่ใช้ในการสำรองข้อมูลโดยไม่ต้องสร้างผู้ใช้ใหม่ทั้งหมดและไม่มีรหัสให้เชลล์ (ตกลงได้อย่างง่ายดาย)


3
นี่มันเจ๋งมาก - แต่ฉันคิดว่ามันสามารถถูกโค่นล้มได้โดยการออกคำสั่งที่ทำ scp แล้วรันสคริปต์หลังจากนั้น!
davidgo

@davidgo prepending $ SSH_ORIGINAL_COMMAND กับ exec อาจช่องโหว่ที่สมมติว่า SCP และ rsync ไม่ได้ว่าตัวเองพยายามที่จะเรียกใช้โปรแกรมหลาย ๆ (ซึ่งในกรณีนี้จะทำลายนั้น)
ฟิล

นอกจากนี้คุณควรจะทำ~/.ssh/authorized_keys, ~/.bashrc(และสิ่งอื่นที่ทุบตีรัน) และ~/.ssh/rcอ่านอย่างเดียวสำหรับผู้ใช้ แต่ถ้าผู้ใช้ที่เป็นอันตรายมีสิทธิ์เข้าถึง rsync หรือ sftp ผู้ใช้จะยังสามารถลบ~/.bashrcและอัปโหลดใหม่ได้ เนื่องจากเป็นการป้องกันที่ยากฉันจึงแนะนำวิธีนี้ ( command="...")
pts

1
@pts คุณสามารถสร้างทั้งไฟล์ rc และ dirs ที่มีไฟล์นั้นเป็นของคนอื่นที่ไม่ใช่ผู้ใช้ (ไม่มีใคร?) และไม่สามารถเขียนได้โดยผู้ใช้ แต่ ณ จุดนี้คุณควรใช้สิ่งที่ทุ่มเทเช่น rssh ว้าวฉันเพิ่งรู้ว่านี่คือคำตอบของฉัน! มันเก่า! ฮ่าฮ่า!
Phil

อย่าลืมscp -S ...และrsync -e ...ให้ผู้ใช้รันคำสั่งโดยพลการ ดังนั้นคุณควรตรวจสอบข้อโต้แย้งใน$ SSH_ORIGINAL_COMMANDก่อนดำเนินการ ข้อมูลเพิ่มเติมที่นี่: exploit-db.com/exploits/24795
pts

1

เปลี่ยนล็อกอินเชลล์ของผู้ใช้เป็นสิ่งที่ จำกัด ซึ่งช่วยให้ผู้ใช้เรียกใช้เฉพาะscp , sftp-serverและrsyncเท่านั้นและยังตรวจสอบว่าไม่อนุญาตการขัดแย้งที่ไม่ปลอดภัย (เช่นscp -S ...และrsync -e .. .ไม่ปลอดภัยดูที่นี่: http://exploit-db.com/exploits/24795 ) ตัวอย่างสำหรับเชลล์ล็อกอินที่ จำกัด :

  • rssh
  • scponly (ไม่เพียง แต่เป็น scp, ยังอนุญาตให้ใช้ sftp, svn และอื่น ๆ ได้หากกำหนดค่าไว้)
  • transfer_shell

คุณอาจต้องการเรียกใช้หนึ่งใน chroot หรือในสภาพแวดล้อมที่ จำกัด อื่น (เช่นnsjailบน Linux) เพื่อปิดการเข้าถึงเครือข่ายและเพื่อการควบคุมที่ง่ายขึ้น (รายการที่อนุญาต) ของไดเรกทอรีที่สามารถอ่านและ / หรือเขียนได้

ผมไม่แนะนำให้ใช้command="..."ใน~/.ssh/authorized_keysเพราะไม่มีการป้องกันเพิ่มเติมระมัดระวัง (เช่นchmod -R u-w ~สำหรับผู้ใช้) ผู้ใช้ที่เป็นอันตรายสามารถอัปโหลดเวอร์ชันใหม่ของ~/.ssh/authorized_keys, ~/.ssh/rcหรือ~/.bashrcและทำให้สามารถรวมและรันคำสั่งโดยพลการ


0

ไม่ใช่โซลูชันที่สง่างามที่สุด แต่คุณสามารถโยนสิ่งนี้ลงในผู้ใช้. bashrc

if [ "$TERM"  != "dumb" ]; then
  exit
fi

ฉันพบว่าผู้ใช้ SCP ได้รับ 'ระยะเวลาโง่' และผู้อื่นจะได้รับ vt100

ฉันคิดว่าผู้ใช้อาจจะสแกนมากกว่า. bashrc ใหม่ซึ่งทำให้นี่ไม่ใช่ทางออกที่ดีที่สุด แต่สำหรับวิธีที่รวดเร็วและสกปรกวิธีนี้จะใช้ได้


1
ฉันขอแนะนำอย่างยิ่งกับวิธีแก้ปัญหาที่เสนอนี้มันง่ายเกินไปสำหรับผู้ใช้ที่ประสงค์ร้ายที่จะหลีกเลี่ยง (เช่นโดยการอัปโหลดอีกรายการ~/.bashrc) นอกจากนี้ยังเป็นขุยในแง่ที่ว่าอาจจะรุ่นใหม่ของ OpenSSH จะตั้งค่าTERMตัวแปรที่แตกต่างกันหรือการตั้งค่าบาง sshd TERMการกำหนดค่าอาจส่งผลกระทบต่อ
pts

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