อนุญาตให้ผู้ใช้ตั้งค่าอุโมงค์ SSH แต่ไม่มีอะไรอื่น


98

ฉันต้องการอนุญาตให้ผู้ใช้ตั้งค่าอุโมงค์ SSH ไปยังเครื่องใดเครื่องหนึ่งบนพอร์ตใดพอร์ตหนึ่ง (เช่น 5000) แต่ฉันต้องการ จำกัด ผู้ใช้รายนี้ให้มากที่สุด (การตรวจสอบความถูกต้องจะใช้คู่กุญแจสาธารณะ / ส่วนตัว)

ฉันรู้ว่าฉันต้องแก้ไขไฟล์ ~ / .ssh / Authorized_keys ที่เกี่ยวข้อง แต่ฉันไม่แน่ใจว่าจะใส่เนื้อหาอะไรในนั้น (นอกเหนือจากคีย์สาธารณะ)

คำตอบ:


92

ใน Ubuntu 11.10 ฉันพบว่าฉันสามารถบล็อกคำสั่ง ssh ส่งโดยมีและไม่มี -T และบล็อกการคัดลอก scp ในขณะที่อนุญาตให้ส่งต่อพอร์ตได้

โดยเฉพาะฉันมีเซิร์ฟเวอร์ redis บน "somehost" ที่ผูกไว้กับ localhost: 6379 ที่ฉันต้องการแบ่งปันอย่างปลอดภัยผ่านอุโมงค์ ssh ไปยังโฮสต์อื่น ๆ ที่มีไฟล์คีย์และจะ ssh ใน:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

สิ่งนี้จะทำให้เซิร์ฟเวอร์ redis พอร์ต "localhost" 6379 บน "somehost" ปรากฏในเครื่องบนโฮสต์ที่เรียกใช้คำสั่ง ssh โดยแมปเป็น "localhost" พอร์ต 16379

บนรีโมต "somehost" นี่คือสิ่งที่ฉันใช้สำหรับ Authorized_keys:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

no-pty เดินทางขึ้นความพยายาม ssh ส่วนใหญ่ที่ต้องการเปิดเทอร์มินัล

permitopen อธิบายว่าพอร์ตใดบ้างที่อนุญาตให้ส่งต่อในกรณีนี้พอร์ต 6379 พอร์ตเซิร์ฟเวอร์ redis ที่ฉันต้องการส่งต่อ

คำสั่ง = "/ bin / echo do-not-send-orders" echoes back "do-not-send-command" หากมีคนหรือบางสิ่งบางอย่างจัดการส่งคำสั่งไปยังโฮสต์ผ่าน ssh -T หรืออย่างอื่น

จาก Ubuntu ล่าสุดman sshdมีคำสั่ง Authorized_keys / command ดังนี้:

command = "command" ระบุว่าคำสั่งถูกเรียกใช้งานเมื่อใดก็ตามที่ใช้คีย์นี้สำหรับการพิสูจน์ตัวตน คำสั่งที่จัดทำโดยผู้ใช้ (ถ้ามี) จะถูกละเว้น

ความพยายามในการใช้การคัดลอกไฟล์ scp ที่ปลอดภัยจะล้มเหลวด้วยเสียงสะท้อนของ "do-not-send-orders" ฉันพบว่า sftp ล้มเหลวด้วยการกำหนดค่านี้

ฉันคิดว่าคำแนะนำเชลล์ที่ถูก จำกัด ซึ่งทำในคำตอบก่อนหน้านี้ก็เป็นความคิดที่ดีเช่นกัน นอกจากนี้ฉันยอมรับว่าทุกอย่างที่มีรายละเอียดในที่นี้สามารถพิจารณาได้จากการอ่าน "man sshd" และค้นหา "Authorized_keys" ในนั้น


1
ในขณะที่no-ptyไม่อนุญาตให้เปิด seesion โต้ตอบมันไม่มีอะไรที่จะป้องกันไม่ให้การดำเนินการคำสั่งเพื่อให้ผู้ใช้สามารถแก้ไขไฟล์ถ้าเขามีการเข้าถึงกับสิ่งที่ต้องการauthorized_keys ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
ไซแนปส์

4
คำสั่ง @synapse = "/ bin / echo do-not-send-orders" ที่ระบุไว้ข้างต้นมีไว้เพื่อบล็อกคำสั่ง และให้ข้อความ คุณตั้งใจให้ตัวอย่างของคุณเอาชนะการตั้งค่าทั้งหมดข้างต้นหรือคุณแค่แสดงความคิดเห็นเกี่ยวกับ no-pty?
พอล

มีการกล่าวถึงว่าผู้ดูแลระบบไม่จำเป็นต้องให้สิทธิ์ผู้ใช้ในการเป็นเจ้าของไฟล์ Author_keys หรือมีไดเร็กทอรีหรือแม้แต่มีอยู่ในโฮมไดเร็กทอรีของผู้ใช้ (สมมติว่าเซิร์ฟเวอร์ ssh ได้รับการกำหนดค่าอย่างเหมาะสมสำหรับตำแหน่งของมัน)
Daniel Farrell

?? @ DanFarrell .ssh / Author_keys จะเป็นของ root หรือ wheel หรือใคร?
Andrew Wolfe

โดยทั่วไปแล้ว @AndrewWolfe ~user/.ssh/authorized_keysจะเป็นของuserและuserจะจัดการคีย์ที่ได้รับอนุญาตที่ใช้ในการเข้าถึงบัญชี SSH จู้จี้จุกจิกเกี่ยวกับสิทธิ์และอาจกำหนดความคาดหวัง~/.ssh/และเนื้อหาของมัน ฉันทำsudo chown root: .ssh/authorized_keysและดูเหมือนว่าจะหยุดฉันไม่ให้เข้าสู่ระบบ แต่ฉันรู้จากประสบการณ์ที่ผ่านมาว่าผู้ใช้ไม่จำเป็นต้องเป็นเจ้าของไฟล์rootนั้น- สามารถจัดการได้หากต้องการ
Daniel Farrell

18

คุณอาจจะต้องตั้งเปลือกของผู้ใช้เพื่อเปลือกที่ถูก จำกัด ยกเลิกการตั้งค่าตัวแปร PATH ใน ~ / .bashrc หรือ ~ / .bash_profile ของผู้ใช้และจะไม่สามารถดำเนินการคำสั่งใด ๆ ในภายหลังหากคุณตัดสินใจว่าต้องการอนุญาตให้ผู้ใช้ดำเนินการชุดคำสั่งที่ จำกัด เช่นlessหรือtailตัวอย่างเช่นคุณสามารถคัดลอกคำสั่งที่อนุญาตไปยังไดเร็กทอรีแยกต่างหาก (เช่น/home/restricted-commands) และอัปเดต PATH ให้ชี้ไปที่ ไดเรกทอรีนั้น


1
แต่นั่นไม่ได้ป้องกันไม่ให้ผู้ใช้ระบุคำสั่งอื่นในบรรทัดคำสั่ง ssh เช่นssh use@host "/bin/bash"มันหรือไม่
Fritz

ใช่มันสมมติว่าuser@hostมี rbash เป็นเชลล์ ดูThe Restricted Shell
Jason Day

โอเคฉันลองแล้วและคุณพูดถูก เนื่องจากคำสั่งที่ระบุถูกเรียกใช้โดยล็อกอินเชลล์การดำเนินการจึง/bin/bashล้มเหลวเนื่องจากมีเครื่องหมายทับ
Fritz

3
แม้ว่าควรจะบอกว่าการอนุญาตlessอาจเป็นความคิดที่ไม่ดีเพราะจากที่นั่นคุณสามารถหลบหนีไปยังเปลือกหอยที่ไม่มีข้อ จำกัด!/bin/bashได้ ดูpen-testing.sans.org/blog/2012/06/06/…สำหรับตัวอย่างอื่น ๆ ดังนั้นการอนุญาตแต่ละคำสั่งควรทำอย่างระมัดระวังมาก ๆ
Fritz

17

นอกจากตัวเลือกที่ได้รับอนุญาตแล้วเช่น no-X11-forwarding แล้วยังมีสิ่งที่คุณต้องการคือ permitopen = "host: port" เมื่อใช้ตัวเลือกนี้ผู้ใช้สามารถตั้งค่าทันเนลไปยังโฮสต์และพอร์ตที่ระบุเท่านั้น

สำหรับรายละเอียดของรูปแบบไฟล์ AUTHORIZED_KEYS โปรดดู man sshd


13
คุณจะต้องระบุ "no-pty" เป็นส่วนหนึ่งของชุดตัวเลือกด้วย หากคุณใช้ "permitopen" เท่านั้นคุณจะ จำกัด อุโมงค์ไว้ที่โฮสต์ / พอร์ตที่กำหนด ... แต่คุณจะยังอนุญาตให้ใช้เชลล์แบบโต้ตอบได้
John Hart

การ จำกัด การส่งต่อพอร์ตด้วย permitopen ยังเป็นการล็อกประเภทของการส่งต่ออุปกรณ์ทันเนลที่ ssh -w ขอหรือไม่
flabdablet

5
@JohnHart: no-ptyไม่ได้ จำกัด การเข้าถึงเชลล์เช่นกันคุณจะยังไปที่เชลล์มันจะไม่แสดงพรอมต์ให้คุณเห็น คุณยังสามารถให้คำสั่งและดูผลลัพธ์ได้ดี คุณจำเป็นต้องมีcommand="..."ตัวเลือกถ้าคุณต้องการที่จะ จำกัด .ssh/authorized_keysการเข้าถึงเปลือกจาก
Aleksi Torhamo

9

ทางออกของฉันคือการให้ผู้ใช้ที่อาจจะเป็นแค่การขุดอุโมงค์โดยไม่ต้องเปลือกโต้ตอบการตั้งค่าในการที่เปลือก/ etc / passwdไป/ usr / bin / tunnel_shell

เพียงแค่สร้างปฏิบัติการไฟล์/ usr / bin / tunnel_shellกับวง จำกัด

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

อธิบายอย่างเต็มที่ที่นี่: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


9
CTRL + Z จะหลบหนีจากสคริปต์ทำให้คุณสามารถเข้าถึง bash ได้อย่างเต็มที่ ... ลองเพิ่ม "trap '' 20 (โดยไม่มีเครื่องหมายอัญประกาศ) ที่จุดเริ่มต้นของสคริปต์
Big Papoo

1
ขอบคุณสำหรับคำแนะนำฉันได้เพิ่มการดักจับสัญญาณขัดจังหวะบางอย่าง
Daniel W.

1
ฉันแค่ใช้ / bin / cat สำหรับ "shell" ดูเหมือนจะทำงานได้ดี ไม่ทราบถึงการหาประโยชน์ใด ๆ กับแมวและแม้ว่าคุณจะพบรูปแบบการป้อนข้อมูลบางอย่างที่ทำให้เกิดความผิดพลาดเซสชัน ssh ของคุณก็จะยุติลง
flabdablet

4
@BigPapoo: คุณทดสอบจริงหรือไม่? ฉันมองไม่เห็นว่ามันจะหนีไปที่ใด หากคุณอยู่ในเชลล์และคุณวิ่งtunnel_shellคุณจะมีshell -> /bin/bash tunnel_shellทางหนีกลับไปที่เชลล์ได้แน่นอน แต่ถ้าคุณตั้งค่าtunnel_shell เป็นเชลล์ของผู้ใช้คุณจะมีเพียงการ/bin/bash tunnel_shellรันโดยไม่มีเชลล์ให้หนี เท่าที่ฉันเห็น ฉันทดสอบแล้วและไม่สามารถหลบหนีด้วย ctrl-z หากคุณได้ลองและสามารถหลบหนีคุณสามารถโพสต์ติดตั้ง? ในทำนองเดียวกันหากคุณทราบเอกสารใด ๆ ที่ระบุว่าควรใช้งานได้เช่นนั้นคุณสามารถโพสต์สิ่งนั้นได้หรือไม่
Aleksi Torhamo

3

ฉันสามารถตั้งค่าไฟล์ Author_keys ด้วยคีย์สาธารณะเพื่อเข้าสู่ระบบสิ่งที่ฉันไม่แน่ใจคือข้อมูลเพิ่มเติมที่ฉันต้องการเพื่อ จำกัด สิ่งที่บัญชีนั้นได้รับอนุญาตให้ทำ ตัวอย่างเช่นฉันรู้ว่าฉันสามารถใส่คำสั่งเช่น:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

คุณต้องการบรรทัดในไฟล์ Authorized_keys ของคุณที่มีลักษณะเช่นนี้

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 

3

หากคุณต้องการอนุญาตการเข้าถึงสำหรับคำสั่งเฉพาะเช่น svn คุณสามารถระบุคำสั่งนั้นในไฟล์คีย์ที่ได้รับอนุญาต:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

จากhttp://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks


3

คุณมีโพสต์ดีๆที่ฉันคิดว่ามีประโยชน์ที่นี่: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

แนวคิดคือ: (ด้วยชื่อผู้ใช้ที่ จำกัด ใหม่เป็น "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

โปรดทราบว่าเราใช้ rbash (restricted-bash) เพื่อ จำกัด สิ่งที่ผู้ใช้ทำได้: ผู้ใช้ไม่สามารถ cd (เปลี่ยนไดเร็กทอรี) และไม่สามารถตั้งค่าตัวแปรสภาพแวดล้อมใด ๆ

จากนั้นเราแก้ไขตัวแปร PATH env ของผู้ใช้/home/sshtunnel/.profileให้เป็นอะไร - เคล็ดลับที่จะทำให้ bash ไม่พบคำสั่งใด ๆ ที่จะดำเนินการ:

PATH=""

ในที่สุดเราไม่อนุญาตให้ผู้ใช้แก้ไขไฟล์ใด ๆ โดยตั้งค่าการอนุญาตต่อไปนี้:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

0

ฉันสร้างโปรแกรม C ซึ่งมีลักษณะดังนี้:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

ฉันตั้งค่าเชลล์ของผู้ใช้ที่ถูก จำกัด เป็นโปรแกรมนี้

ฉันไม่คิดว่าผู้ใช้ที่ถูก จำกัด จะสามารถดำเนินการอะไรได้แม้ว่าพวกเขาจะทำssh server commandก็ตามเพราะคำสั่งนั้นดำเนินการโดยใช้เชลล์และเชลล์นี้ไม่ได้ดำเนินการใด ๆ


-1

ดูโพสต์นี้เกี่ยวกับการตรวจสอบสิทธิ์คีย์สาธารณะโพสต์นี้ในการตรวจสอบคีย์สาธารณะ

สิ่งสำคัญสองประการที่คุณต้องจำคือ:

  1. ให้แน่ใจว่าคุณ chmod 700 ~/.ssh
  2. ต่อท้ายบล็อกคีย์สาธารณะกับคีย์ที่ได้รับอนุญาต

-3

คุณจะสร้างคีย์บนเครื่องผู้ใช้ผ่านไคลเอนต์ ssh ที่พวกเขาใช้อยู่ ตัวอย่างเช่น pUTTY มียูทิลิตี้ในการทำสิ่งนี้แน่นอน มันจะสร้างทั้งคีย์ส่วนตัวและคีย์สาธารณะ

เนื้อหาของไฟล์คีย์สาธารณะที่สร้างขึ้นจะถูกวางไว้ในไฟล์ Author_keys

ถัดไปคุณต้องตรวจสอบให้แน่ใจว่าไคลเอนต์ ssh ได้รับการกำหนดค่าให้ใช้คีย์ส่วนตัวที่สร้างคีย์สาธารณะ ค่อนข้างตรงไปตรงมา แต่แตกต่างกันเล็กน้อยขึ้นอยู่กับลูกค้าที่ใช้

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