คำตอบนี้พัฒนาทั้งตามคำตอบที่เลือกโดยเพิ่มความปลอดภัยมากขึ้น
คำตอบนั้นกล่าวถึงรูปแบบทั่วไป
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
ที่มีความปลอดภัยอาจจะขาดอยู่ในssh
สิทธิ์อนุญาตให้<user B>
ในการhost B>
ที่จะssh
เข้ามาhost A
และดำเนินการใด ๆคำสั่ง
แน่นอนว่าB
การA
เข้าถึงอาจได้รับการระบุด้วยssh
รหัสแล้วและอาจมีรหัสผ่านด้วย แต่การรักษาความปลอดภัยอีกชั้นหนึ่งสามารถ จำกัด ขอบเขตของคำสั่งที่อนุญาตซึ่งB
สามารถดำเนินการได้A
เช่นนั้นrm -rf /
ไม่สามารถเรียกได้ (นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อssh
คีย์ไม่มีรหัสผ่าน)
โชคดีที่ssh
มีในตัวคุณสมบัติที่เรียกว่าข้อ จำกัด คำสั่งหรือคำสั่งบังคับ ดูssh.comหรือคำถาม serverfault.comนี้
โซลูชันด้านล่างแสดงโซลูชันแบบฟอร์มทั่วไปพร้อมกับssh
การบังคับใช้ข้อ จำกัด คำสั่ง
ตัวอย่างโซลูชันที่เพิ่มข้อ จำกัด คำสั่ง
โซลูชันที่ปรับปรุงด้านความปลอดภัยนี้ตามรูปแบบทั่วไปการโทรจากssh
เซสชันบนhost-B
เป็นเพียง:
cat <file> | ssh <user-A>@<host A> to_clipboard
ส่วนที่เหลือจะแสดงการตั้งค่าเพื่อให้ใช้งานได้
การตั้งค่าข้อ จำกัด คำสั่ง ssh
สมมติว่าบัญชีผู้ใช้เปิดB
คือuser-B
และ B มีคีย์ ssh id-clip
ที่สร้างขึ้นตามปกติ ( ssh-keygen
)
จากนั้นในuser-A
ไดเรกทอรี ssh มีไฟล์
/home/user-A/.ssh/authorized_keys
ที่จดจำรหัสid-clip
และอนุญาตssh
การเชื่อมต่อ
โดยปกติเนื้อหาของแต่ละสายจะตรงคีย์สาธารณะได้รับอนุญาตเช่นเนื้อหาของauthorized_keys
id-clip.pub
อย่างไรก็ตามเพื่อบังคับใช้ข้อ จำกัด คำสั่งว่าเนื้อหาคีย์สาธารณะนั้นได้รับการจัดทำขึ้น (ในบรรทัดเดียวกัน) โดยคำสั่งที่จะดำเนินการ
ในกรณีของเรา:
command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>
คำสั่งที่กำหนด"/home/user-A/.ssh/allowed-commands.sh id-clip"
และเฉพาะคำสั่งที่กำหนดว่าจะดำเนินการเมื่อใดก็ตามที่สำคัญid-clip
ถูกนำมาใช้เริ่มต้นการssh
เชื่อมต่อhost-A
- ไม่ว่าสิ่งที่คำสั่งเป็นลายลักษณ์อักษรssh
บรรทัดคำสั่ง
คำสั่งระบุไฟล์สคริปต์allowed-commands.sh
และเนื้อหาของไฟล์สคริปต์นั้นคือ
#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
Id=${1}
case "$SSH_ORIGINAL_COMMAND" in
"to-clipboard")
notify-send "ssh to-clipboard, from ${Id}"
cat | xsel --display :0 -i -b
;;
*)
echo "Access denied"
exit 1
;;
esac
การโทรไปssh
ที่เครื่องB
เดิมคือ
... | ssh <user-A>@<host A> to_clipboard
สตริงto-clipboard
จะถูกส่งไปโดยตัวแปรสภาพแวดล้อมallowed-commands.sh
SSH_ORIGINAL_COMMAND
นอกจากนี้เราได้ผ่านชื่อของคีย์ที่id-clip
จากเส้นในที่มีการเข้าถึงโดยเฉพาะauthorized_keys
id-clip
เส้น
notify-send "ssh to-clipboard, from ${Id}"
เป็นเพียงกล่องข้อความป๊อปอัพเพื่อแจ้งให้คุณทราบว่ากำลังเขียนคลิปบอร์ดซึ่งอาจเป็นคุณลักษณะด้านความปลอดภัยที่ดีเช่นกัน ( notify-send
ทำงานบน Ubuntu 18.04 อาจจะไม่ใช่คนอื่น)
ในสาย
cat | xsel --display :0 -i -b
พารามิเตอร์--display :0
จำเป็นเนื่องจากกระบวนการไม่มี X display เป็นของตัวเองพร้อมคลิปบอร์ดดังนั้นจึงต้องเจาะจงอย่างชัดเจน ค่านี้:0
จะทำงานกับ Ubuntu 18.04 กับเซิร์ฟเวอร์หน้าต่าง Wayland ในการตั้งค่าอื่น ๆ อาจไม่ทำงาน สำหรับเซิร์ฟเวอร์ X มาตรฐานคำตอบนี้อาจช่วยได้
host-A
/etc/ssh/sshd_config
พารามิเตอร์
ในที่สุดพารามิเตอร์บางตัวใน/etc/ssh/sshd_config
โฮสต์A
ที่ควรตั้งค่าเพื่อให้แน่ใจว่าได้รับอนุญาตให้เชื่อมต่อและสิทธิ์ในการใช้ssh
-key เท่านั้นโดยไม่ต้องใช้รหัสผ่าน:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
เพื่อให้sshd
เซิร์ฟเวอร์อ่านการกำหนดค่าอีกครั้ง
sudo systemctl restart sshd.service
หรือ
sudo service sshd.service restart
ข้อสรุป
มันเป็นความพยายามในการตั้งค่า แต่ฟังก์ชั่นอื่น ๆ นอกเหนือจากto-clipboard
สามารถสร้างขึ้นในแบบคู่ขนานกรอบเดียวกัน
:'<,'>w !ssh desktop pbcopy