วิธีการตั้งค่า umsh ของ ssh สำหรับการเชื่อมต่อทุกประเภท


34

ฉันค้นหาวิธีการตั้งค่าumaskของ OpenSSH ให้0027สอดคล้องกับการเชื่อมต่อทุกประเภท

ตามประเภทการเชื่อมต่อฉันหมายถึง:

  1. SFTP
  2. SCP
  3. ชื่อโฮสต์ssh
  4. โปรแกรมชื่อโฮสต์ssh

ความแตกต่างระหว่าง 3. และ 4 คือการเริ่มต้นเชลล์ซึ่งมักจะอ่าน/etc/profileข้อมูลในขณะที่หลังไม่ได้

นอกจากนี้โดยการอ่านโพสต์นี้ฉันได้ตระหนักถึงตัวเลือก -u ที่มีอยู่ใน OpenSSH เวอร์ชั่นใหม่กว่า อย่างไรก็ตามสิ่งนี้ไม่ทำงาน

ฉันยังต้องเพิ่มว่าในขณะนี้มี/etc/profileumask 0027

จุดต่อจุด:

  • SFTP - การตั้งค่า-u 0027ในการsshd_configเป็นที่กล่าวถึงที่นี่ไม่เพียงพอ

ถ้าผมไม่ได้ตั้งค่าพารามิเตอร์นี้ใช้ SFTP umask 0022โดยค่าเริ่มต้น ซึ่งหมายความว่าหากฉันมีสองไฟล์:

-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write

เมื่อฉันใช้ sftp เพื่อวางไว้ในเครื่องปลายทางฉันได้รับจริง:

-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

แต่เมื่อฉันตั้ง-u 0027บนsshd_configของเครื่องปลายทางที่จริงผมจะได้รับ:

-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

ซึ่งไม่คาดหวังเนื่องจากควรเป็นจริง:

-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write

ทุกคนเข้าใจว่าทำไมสิ่งนี้เกิดขึ้น

  • SCP - เป็นอิสระจากสิ่งที่มีการติดตั้งสำหรับSFTPumask 0022สิทธิ์อยู่เสมอ ขณะนี้ฉันยังไม่รู้เลยว่าจะแก้ไขสิ่งนี้อย่างไร

  • ssh hostname - ไม่มีปัญหาที่นี่เนื่องจากเชลล์อ่าน/etc/profileตามค่าเริ่มต้นซึ่งหมายถึงumask 0027การตั้งค่าปัจจุบัน

  • SSHชื่อโฮสต์โปรแกรม - สถานการณ์เดียวกับSCP


โดยรวมแล้วการตั้งค่า umask บนsftpเปลี่ยนแปลงผลลัพธ์ แต่ไม่ควรssh hostnameทำตามที่คาดไว้การอ่าน/etc/profileและทั้งสองอย่างscpและssh hostname programดูเหมือนจะมีumask 0022ฮาร์ดโค้ดบางแห่ง

เรายินดีรับข้อมูลเชิงลึกเกี่ยวกับประเด็นใด ๆ ข้างต้น

แก้ไข:ฉันต้องการหลีกเลี่ยงการแก้ไขที่ต้องรวบรวม openssh ด้วยตนเอง ระบบกำลังเรียกใช้ Ubuntu Server 10.04.01 (ชัดเจน) LTS พร้อมopensshแพ็คเกจจากผู้ไม่ฝักใฝ่ฝ่ายใด

คำตอบ:ตามที่ระบุโดย poige การใช้ pam_umask ทำเคล็ดลับ

การเปลี่ยนแปลงที่แน่นอนคือ:

เพิ่มบรรทัดใน/etc/pam.d/sshd:

# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session    optional     pam_umask.so umask=0027

นอกจากนี้เพื่อให้มีผลกับเชลล์ล็อกอินทั้งหมดโดยไม่คำนึงว่าพวกเขามา/etc/profileหรือไม่ก็มีการเพิ่มบรรทัดเดียวกัน/etc/pam.d/loginด้วย

แก้ไข : หลังจากความคิดเห็นบางส่วนฉันได้ทดสอบปัญหานี้อีกครั้ง

อย่างน้อยใน Ubuntu (ที่ฉันทดสอบ) ดูเหมือนว่าหากผู้ใช้มี umask ที่แตกต่างกันในไฟล์ init ของเชลล์ (.bashrc, .zshrc, ... ), PAM umask จะถูกละเว้นและผู้ใช้กำหนด umask แทน การเปลี่ยนแปลงที่/etc/profileไม่ส่งผลกระทบต่อผลลัพธ์เว้นแต่ผู้ใช้ระบุแหล่งที่มาของการเปลี่ยนแปลงเหล่านั้นในไฟล์ init

ยังไม่มีความชัดเจนในจุดนี้หากพฤติกรรมนี้เกิดขึ้นในทุก distros


Unode: "ฉันต้องการหลีกเลี่ยงการแก้ไขที่ต้องมีการรวบรวม openssh ด้วยตนเอง" ทำไม?
desasteralex

5
@desasteralex - เพราะ (ถ้าเป็นไปได้) ฉันต้องการหลีกเลี่ยงงานบำรุงรักษา / การดูแลเพิ่มเติมที่มาพร้อมกับแพ็กเกจที่มาจากแหล่งและเพราะฉันคิดว่ามันยากที่จะเชื่อว่าไม่มีวิธีอื่นที่จะเปลี่ยนแปลง umask อื่น ๆ พิจารณาเป็นพิเศษนี้เป็นลักษณะความปลอดภัยขั้นพื้นฐานค่อนข้างบนระบบใด ๆ
Unode

1
หลังจากแก้ไข /etc/pam.d/sshd (และเข้าสู่ระบบ) และเริ่ม ssh ใหม่ฉันไม่เห็นการเปลี่ยนแปลงพฤติกรรม มีการเปลี่ยนแปลงอื่น ๆ ที่จำเป็นโดยนัย แต่ไม่ได้กล่าวถึงที่นี่?
Steve Clay

@mrclay - คุณมีUsePAM yessshd_config ของคุณหรือไม่
Unode

1
เพื่อแก้ปัญหา .bashrc ของผู้ใช้ลอง aliasing ห่างคำสั่ง umask /etc/profileในของคุณ บางสิ่งบางอย่างเช่นalias umask=/bin/true
Tobia

คำตอบ:


22

ฉันขอแนะนำให้ลอง 2 สิ่ง:

  1. pam_umask
  2. LD_PRELOAD wrapper (เขียนเองได้ไหม)

1
+1, pam_umask ดูเหมือนจะเป็นทางออกที่ง่ายที่สุด
เฟล็กโซ

pam_umask ใช้เล่ห์เหลี่ยม คำถามที่แก้ไขแล้วเพื่อสะท้อนและขยายคำตอบ
Unode

เพียงแค่ใช้stackoverflow.com/q/10220531/220060 อย่างไรก็ตามระวังหากคุณพิมพ์ผิดคุณจะล็อคตัวเองออกจากเซิร์ฟเวอร์ ตรวจสอบทุกครั้งว่าคุณสามารถเข้าสู่ระบบอีกครั้งก่อนที่จะปิดเซสชันปัจจุบันของคุณ
nalply

1
นอกเหนือจากการแสดงความคิดเห็นโดย @nalply นี้ให้แน่ใจว่าจะมีการสำรองข้อมูลรากเปิดเซสชั่นตั้งแต่หมดวิธี PAM คุณจะไม่สามารถsudoหรือsudo suหรือชอบ
Zero3

13

นี่คือวิธีแก้ปัญหาที่จะช่วยให้คุณทำสิ่งที่คุณต้องการในแบบต่อผู้ใช้ มันใช้sshdคุณสมบัติดั้งเดิมเท่านั้นและไม่ต้องการการแมคเกี่ยวกับแพทช์บำรุงรักษาในพื้นที่ วิธีนี้ใช้ประโยชน์จากการForceCommandทำงานของ sshd เพื่อแทรกสคริปต์การตั้งค่าสภาพแวดล้อมในทุกการเชื่อมต่อ ssh แล้วเรียกใช้คำสั่งเดิม

ก่อนอื่นให้สร้างสคริปต์บนระบบของคุณโดยมีเนื้อหาดังต่อไปนี้:

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"

/usr/bin/umask-wrapperสำหรับวัตถุประสงค์ของตัวอย่างนี้ฉันจะถือว่าคุณได้นี้เรียกว่า

ตอนนี้คุณมีตัวเลือกน้อยในการตั้งค่านี้ หากคุณต้องการให้สิ่งนี้เป็นการกำหนดค่าที่จำเป็นสำหรับผู้ใช้ทั้งหมด (ซึ่งดูเหมือนจะไม่น่าเป็นไปได้) คุณสามารถแก้ไขการกำหนดค่า sshd ของคุณเพื่อรวมสิ่งต่อไปนี้:

ForceCommand /usr/bin/umask-wrapper

หากคุณต้องการให้สิ่งนี้มีผลกับผู้ใช้บางคนคุณสามารถใช้Matchบล็อก (ซึ่งจะอยู่ที่ส่วนท้ายของคุณsshd_config):

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper

หากคุณต้องการให้สิ่งนี้เป็นพฤติกรรมที่ผู้ใช้สามารถควบคุมได้คุณสามารถใช้command=ตัวเลือกในauthorized_keyไฟล์เพื่อเลือกลักษณะการทำงานนี้สำหรับคีย์เฉพาะ ตัวอย่างเช่นในขณะที่ทดสอบสิ่งนี้ฉันได้เพิ่มรายการในauthorized_keysไฟล์ของฉันที่มีลักษณะดังนี้:

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test

และนี่คือผลการทดสอบของฉัน:

ใช้sshโดยไม่มีคำสั่ง:

localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb  2 06:02 file1

ใช้sshกับคำสั่ง:

localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file2

การใช้scp:

localhost$ touch file3
localhost$ ls -l file3
-rw-r--r--  1 lars  staff  0 Feb  2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file3

การใช้sftp:

localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r-----    0 500      500             0 Feb  2 06:05 umask-test/file4

และคุณมีมัน ฉันเชื่อว่านี่เป็นพฤติกรรมที่คุณมองหา หากคุณมีคำถามใด ๆ เกี่ยวกับโซลูชันนี้ฉันยินดีที่จะให้รายละเอียดเพิ่มเติม


แม้ว่าวิธีนี้ดูเหมือนว่าจะใช้งานได้ แต่ก็ดูเป็นฝันร้ายบำรุงรักษา ถึงกระนั้น +1 สำหรับกรณีที่ไม่สามารถใช้ pam ได้
Unode

3
ฉันไม่รู้ว่ามันเป็นเรื่องยากที่จะรักษา ข้อได้เปรียบหลักเหนือโซลูชันที่ใช้ PAM คือไม่จำเป็นต้องมีสิทธิ์พิเศษใด ๆ - คุณสามารถตั้งค่านี้สำหรับบัญชีของคุณเองโดยไม่ต้องมีผู้ดูแล
larsks

ฉันคิดในแง่ของการเก็บรายชื่อผู้ใช้ที่เลือกไว้ แต่แน่นอนฉันไม่ได้สังเกตเห็นแง่มุมของการใช้งานการตั้งค่าผู้ใช้ธรรมดา เมื่อฉันอ่านครั้งแรกฉันคิดว่า ForceCommand คือ "ต้อง" และไม่ใช่ "วิธีการตั้งค่า" command=แน่นอนคุณสมบัติที่เป็นระเบียบของ ssh
Unode

5

ฉันใช้วิธีที่แตกต่างกันเล็กน้อยเพื่อรวมการตั้งค่าไว้ที่ส่วนกลาง

สิ่งนี้ถูกเพิ่มไปที่/etc/pam.d/common-session:

session    optional     pam_umask.so

สิ่งนี้ถูกแก้ไขใน/etc/login.defs:

UMASK           0027

2

ฉันได้รับ pam_umask เพื่อทำงานกับ ssh แต่ไม่ใช่กับ scp หรือ sftp

วิธีการ wrapper ยังไม่ทำอะไรเลยสำหรับ SFTP หรือ SCP ฉันไม่แน่ใจว่า 027 เป็นตัวอย่างที่ดีเนื่องจาก distros ส่วนใหญ่มี umask ตั้งไว้แล้ว ลองกับ 002 และดูว่าใช้งานได้หรือไม่


1

โปรแกรมที่ไม่ได้ตั้งค่า umask ของตนเองจะสืบทอด umask ของแอปพลิเคชันที่เริ่มต้นขึ้น หยุด sshd อย่างสมบูรณ์ตั้ง umask ของคุณเป็น 0027 แล้วเริ่มใหม่อีกครั้ง (คุณสามารถเพิ่มคำสั่ง umask ในสคริปต์ init สำหรับการรีบูตในอนาคต)

ผ่านการทดสอบการใช้งานกับ SCP


ขออภัย DerfK แต่นี่เป็นหนึ่งในสิ่งแรก ๆ ที่ฉันพยายามไม่ประสบความสำเร็จ เชลล์ล็อกอินทั้งหมดมีumask 0027(ถ้าพวกเขาอ่าน/etc/profile) แต่การรีสตาร์ท ssh จะไม่มีผลกับ scp หรือ ssh
Unode

1

หากpam_umaskดูเหมือนจะไม่ส่งผลกระทบต่อเซสชัน SFTP ของคุณให้ตรวจสอบว่าUsePamได้ตั้งค่าไว้Yesใน/etc/ssh/sshd_configไฟล์หรือไม่

ถ้าคุณมีตรวจสอบรหัสผ่านพิการและได้รับการตั้งค่าหรือผิดนัดไปUsePam Noคุณอาจต้องการตั้งค่าChallengeResponseAuthentication Noในsshd_configไฟล์เพราะมิฉะนั้นคุณอาจเปิดใช้งานการตรวจสอบรหัสผ่านโดยไม่ตั้งใจผ่านระบบนั้น


1

หมายเหตุเพิ่มเติมสำหรับคำตอบของผู้ใช้ 188737 ด้านบน:

สิ่งนี้อาจไปโดยไม่บอก แต่ถ้าคุณไม่ได้ใช้แพ็คเกจopenssh-serverและมีการรวบรวม OpenSSH ด้วยตนเองตรวจสอบให้แน่ใจว่าคุณ "เปิดใช้งานการสนับสนุน PAM" โดยผ่านการ--with-pamตั้งค่าสถานะ

มิฉะนั้นUsePAM=yesใน sshd_config บวกการเปลี่ยนแปลงใด ๆ ที่จะได้อย่างมีประสิทธิภาพได้รับการปฏิเสธโดย/etc/pam.d/*sshd

ในที่สุดมันก็เริ่มกับฉันว่าทำไมไม่มีวิธีการแก้ปัญหา PAM ที่แนะนำใด ๆ ที่มีผลกระทบต่อการทดสอบผ่านการเชื่อมต่อ SFTP แบบไม่โต้ตอบ ...


1

เนื่องจาก umask สืบทอดมาจากกระบวนการพาเรนต์บนระบบ Slackware ที่ใช้/etc/rc.d/rc.sshdในการเริ่ม / หยุด / รีสตาร์ท sshd คุณสามารถวางumask 0027บนบรรทัดด้วยตัวเองโดยตรงเหนือ "sshd_start" หรือ "sshd_restart" หรือ ณ จุดใด ๆ ก่อน ส่วนการประมวลผลหลักเริ่มต้นขึ้นใน/etc/rc.d/rc.sshd:

case "$1" in
'start')
  umask 0027
  sshd_start
  ;;
'stop')
  sshd_stop
  ;;
'restart')
  umask 0027
  sshd_restart
  ;;
*)

หรืออีกวิธีหนึ่งที่ด้านบนของไฟล์:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027

0

ฉันเพิ่งทดสอบการปรับปรุงที่เป็นไปได้กับตัวเลือก larsks sshd_config บน solaris 11

ตั้งกลุ่มกับผู้ใช้เพื่อจัดการและย้ายสคริปต์ไปยังไฟล์ปรับแต่งเองในกรณีของฉันฉันต้องการตั้ง umask เป็น 0002

การกำหนดค่าผลลัพธ์จะกลายเป็น ....

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'

0

ฉันได้รับการดิ้นรนกับปัญหานี้โดยเฉพาะกับสิทธิ์ของไฟล์หลังจากคัดลอกไฟล์โดยใช้scpและในที่สุดก็เกิดขึ้นกับฉันเพียงแค่ใช้ ssh เพื่อเปลี่ยนสิทธิ์หลังจากคัดลอก

นี่คือทางออก:

  1. คัดลอกไฟล์ของคุณ: localhost$ scp filename remotehost:umask-test/filename
  2. แก้ไขการอนุญาต: localhost$ ssh remotehost "chmod go+r umask-test/filename"

เหนือสิ่งอื่นใดคือไม่จำเป็นต้องเข้าถึงรูทเพื่อแก้ไขปัญหานี้

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