Cách thiết lập ô của ssh cho tất cả các loại kết nối


34

Tôi đã tìm kiếm một cách để thiết lập OpenSSH của umask để 0027theo một cách nhất quán trên tất cả các loại kết nối.

Theo loại kết nối tôi đang đề cập đến:

  1. sftp
  2. scp
  3. tên máy chủ ssh
  4. chương trình tên máy chủ ssh

Sự khác biệt giữa 3. và 4. là cái trước bắt đầu một shell thường đọc /etc/profilethông tin trong khi cái sau không.

Ngoài ra, bằng cách đọc bài đăng này, tôi đã biết đến tùy chọn -u có trong các phiên bản OpenSSH mới hơn. Tuy nhiên điều này không hoạt động.

Tôi cũng phải thêm rằng /etc/profilebây giờ bao gồm umask 0027.

Đi từng điểm:

  • sftp - Thiết -u 0027trong sshd_confignhư đã đề cập ở đây , là không đủ.

Nếu tôi không đặt tham số này, sftp sẽ sử dụng theo mặc định umask 0022. Điều này có nghĩa là nếu tôi có hai tệp:

-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

Khi tôi sử dụng sftp để đặt chúng vào máy đích, tôi thực sự nhận được:

-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

Tuy nhiên khi tôi đặt -u 0027trên sshd_configcác máy tính đích tôi thực sự nhận được:

-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

điều không được mong đợi, vì nó thực sự nên là:

-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

Bất cứ ai cũng hiểu tại sao điều này xảy ra?

  • scp - Độc lập với những gì được thiết lập cho sftp , luôn có quyền umask 0022. Tôi hiện không có ý tưởng làm thế nào để thay đổi điều này.

  • Tên máy chủ ssh - không có vấn đề gì ở đây vì shell đọc /etc/profiletheo mặc định có nghĩa là umask 0027trong thiết lập hiện tại.

  • chương trình tên máy chủ ssh - tình huống tương tự như scp .


Tóm lại, cài đặt các ô trên sftpthay đổi kết quả nhưng không như mong muốn, ssh hostnamehoạt động như đọc dự kiến /etc/profilevà cả hai scpssh hostname programdường như đã được umask 0022mã hóa ở đâu đó.

Bất kỳ cái nhìn sâu sắc về bất kỳ điểm nào ở trên đều được chào đón.

EDIT: Tôi muốn tránh các bản vá yêu cầu biên dịch thủ công. Hệ thống đang chạy Ubuntu Server 10.04.01 (sáng suốt) LTS với opensshcác gói từ maverick.

Trả lời: Như được chỉ định bởi poige, sử dụng pam_umask đã thực hiện thủ thuật.

Những thay đổi chính xác là:

Dòng được thêm vào /etc/pam.d/sshd:

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

Ngoài ra, để ảnh hưởng đến tất cả các shell đăng nhập bất kể chúng có nguồn /etc/profilehay không, các dòng tương tự cũng được thêm vào /etc/pam.d/login.

EDIT : Sau một số ý kiến ​​tôi đã kiểm tra lại vấn đề này.

Ít nhất là trong Ubuntu (nơi tôi đã thử nghiệm), dường như nếu người dùng có một ô khác nhau được đặt trong các tệp init của shell của họ (.bashrc, .zshrc, ...), thì ô dù PAM sẽ bị bỏ qua và thay vào đó người dùng đã xác định sử dụng ô. Thay đổi trong không /etc/profileảnh hưởng đến kết quả trừ khi người dùng rõ ràng nguồn những thay đổi đó trong tệp init.

Không rõ tại thời điểm này nếu hành vi này xảy ra trong tất cả các bản phát hành.


Unode: "Tôi muốn tránh các bản vá yêu cầu biên dịch thủ công openssh." Tại sao?
desasteralex

5
@desasteralex - Bởi vì (nếu có thể) tôi muốn tránh có thêm nhiệm vụ bảo trì / quản trị đi kèm với các gói dựa trên nguồn và vì tôi thấy khó có thể tin rằng không có cách nào khác để thay đổi ô ngoài việc vá mở. Đặc biệt xem xét đây là một khía cạnh bảo mật khá cơ bản trên bất kỳ hệ thống.
Giải mã

1
Sau khi thay đổi /etc/pam.d/sshd (và đăng nhập) và khởi động lại ssh, tôi thấy không có thay đổi hành vi. Có những thay đổi cần thiết khác ngụ ý nhưng không được đề cập ở đây?
Steve Clay

@mrclay - Bạn có UsePAM yestrong sshd_config không?
Giải mã

1
Để giải quyết vấn đề .bashrc của người dùng, hãy thử đặt bí danh cho lệnh umask trong của bạn /etc/profile. Một cái gì đó giống nhưalias umask=/bin/true
Tobia 18/03/13

Câu trả lời:


22

Tôi có thể đề nghị thử 2 điều:

  1. pam_umask
  2. Trình bao bọc LD_PRELOAD (tự viết?)

1
+1, pam_umask dường như là giải pháp đơn giản nhất
Flexo

pam_umask thực hiện các mẹo. Câu hỏi được chỉnh sửa để phản ánh và xây dựng câu trả lời
Giải mã

Chỉ cần sử dụng stackoverflow.com/q/10220531/220060 . Tuy nhiên, hãy cẩn thận, nếu bạn gõ nhầm, bạn sẽ tự khóa máy chủ. Luôn kiểm tra xem bạn có thể đăng nhập lại trước khi đóng phiên hiện tại không.
nalply

1
Bổ sung vào nhận xét của @nalply: Đảm bảo mở phiên gốc gốc sao lưu , vì phá vỡ PAM có nghĩa là bạn sẽ không thể sudohoặc sudo sutương tự.
Zero3

13

Đây là một giải pháp cho phép bạn làm những gì bạn muốn trên cơ sở mỗi người dùng. Nó chỉ sử dụng các sshdtính năng gốc và không yêu cầu mucking với các bản vá được duy trì cục bộ. Giải pháp này lợi dụng ForceCommandhành vi của sshd để chèn tập lệnh thiết lập môi trường vào mọi kết nối ssh, rồi chạy lệnh gốc.

Đầu tiên, tạo một tập lệnh ở đâu đó trên hệ thống của bạn với các nội dung sau:

#!/bin/sh

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

Đối với mục đích của ví dụ này, tôi sẽ cho rằng bạn đã gọi nó /usr/bin/umask-wrapper.

Bây giờ, bạn có một vài tùy chọn trong việc thiết lập này. Nếu bạn muốn đây là cấu hình bắt buộc cho tất cả người dùng (có vẻ hơi khó xảy ra), bạn có thể sửa đổi cấu hình sshd của mình để bao gồm:

ForceCommand /usr/bin/umask-wrapper

Nếu bạn chỉ muốn áp dụng điều này cho một số người dùng, bạn có thể sử dụng một Matchkhối (điều này sẽ ở cuối của bạn sshd_config):

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

Nếu bạn muốn đây là hành vi do người dùng kiểm soát, thì bạn có thể sử dụng command=tùy chọn trong một authorized_keytệp để chọn hành vi này cho các khóa cụ thể. Ví dụ, trong khi kiểm tra điều này, tôi đã thêm một mục vào authorized_keystệp của mình trông giống như thế này:

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

Và đây là một số kết quả thử nghiệm của tôi:

Sử dụng sshkhông có lệnh:

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

Sử dụng sshvới một lệnh:

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

Sử dụng 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

Sử dụng 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

Và bạn có nó rồi đấy! Tôi tin rằng đây là hành vi bạn đang tìm kiếm. Nếu bạn có bất kỳ câu hỏi về giải pháp này, tôi sẽ vui lòng cung cấp thêm chi tiết.


Mặc dù phương pháp này có vẻ hiệu quả, nhưng nó có vẻ là một cơn ác mộng bảo trì. Tuy nhiên, +1 cho các trường hợp không thể sử dụng pam.
Giải mã

3
Tôi không biết rằng thật khó để duy trì. Ưu điểm chính so với giải pháp dựa trên PAM là nó không yêu cầu bất kỳ đặc quyền đặc biệt nào - bạn có thể thiết lập điều này cho tài khoản của riêng bạn mà không cần sự can thiệp của quản trị viên.
larsks

Tôi đã suy nghĩ về việc giữ một danh sách người dùng được chọn, nhưng thực sự tôi đã không nhận thấy khía cạnh của việc này khi thiết lập người dùng đơn giản. Khi tôi đọc nó lần đầu tiên, tôi nghĩ ForceCommand là "bắt buộc" chứ không phải "một cách để thiết lập nó". command=thực sự là một tính năng gọn gàng của ssh.
Giải mã

5

Tôi đã thực hiện một cách tiếp cận hơi khác nhau để tập trung vào các thiết lập.

Điều này đã được thêm vào /etc/pam.d/common-session:

session    optional     pam_umask.so

Điều này đã được sửa đổi trong /etc/login.defs:

UMASK           0027

2

Tôi đã nhận được pam_umask để làm việc với ssh, nhưng không phải với scp hoặc sftp.

Phương thức trình bao bọc cũng không làm gì cho sftp hoặc scp. Tôi không chắc chắn 027 là một ví dụ hay vì hầu hết các bản phân phối đều được cài đặt sẵn. Hãy thử với 002 và xem nếu nó hoạt động.


1

Các chương trình không đặt ô riêng của họ kế thừa ô của ứng dụng đã khởi động ứng dụng đó. Dừng sshd hoàn toàn, đặt ô của bạn thành 0027, sau đó khởi động lại. (Bạn có thể thêm lệnh umask trong tập lệnh init để khởi động lại trong tương lai.)

Đã thử nghiệm để làm việc với scp.


Xin lỗi DerfK nhưng đây là một trong những điều đầu tiên tôi đã thử mà không thành công. Tất cả các shell đăng nhập đều có umask 0027(nếu chúng đọc /etc/profile) nhưng khởi động lại ssh không ảnh hưởng đến scp hay ssh.
Giải mã

1

Nếu pam_umaskdường như không ảnh hưởng đến các phiên SFTP của bạn, thì hãy kiểm tra xem có UsePamđược đặt thành Yestrong /etc/ssh/sshd_configtệp không.

Nếu bạn đã tắt xác thực mật khẩu và UsePamđược đặt hoặc mặc định là No. Bạn có thể muốn đặt ChallengeResponseAuthentication Notrong sshd_configtệp vì nếu không, bạn có thể vô tình kích hoạt xác thực mật khẩu thông qua hệ thống đó.


1

Một ghi chú được thêm vào câu trả lời của người dùng188737 ở trên:

Điều này có thể không cần phải nói, nhưng nếu bạn không sử dụng gói máy chủ openssh và đã biên dịch OpenSSH theo cách thủ công , hãy đảm bảo bạn "Kích hoạt hỗ trợ PAM" bằng cách chuyển --with-pamcờ cấu hình.

Mặt khác, UsePAM=yestrong sshd_config, cộng với bất kỳ thay đổi nào /etc/pam.d/*sẽ bị bỏ qua một cách hiệu quả sshd.

Cuối cùng tôi cũng hiểu ra lý do tại sao không có giải pháp PAM được đề xuất nào có ảnh hưởng đến việc kiểm tra thông qua các kết nối SFTP không tương tác ...


1

Vì umask được kế thừa từ tiến trình cha, nên trên hệ thống Slackware sử dụng /etc/rc.d/rc.sshdđể bắt đầu / dừng / khởi động lại sshd, bạn có thể chỉ cần đặt umask 0027một dòng trên chính nó ngay phía trên "sshd_start" hoặc "sshd_restart", hoặc thay vào đó, tại bất kỳ thời điểm nào trước phần thực hiện chính bắt đầu, trong /etc/rc.d/rc.sshd:

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

Hoặc, cách khác, ở đầu tệp:

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

0

Tôi vừa thử nghiệm một cải tiến có thể cho các tùy chọn sshd_config của larsks trên solaris 11

Thiết lập một nhóm với người dùng sẽ được quản lý và di chuyển tập lệnh vào tệp cấu hình, trong trường hợp của tôi, tôi muốn đặt umask thành 0002.

cấu hình kết quả trở thành ....

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

0

Tôi đã được đấu tranh với vấn đề này, đặc biệt với các điều khoản tập tin sau khi sao chép một tập tin sử dụng scp , và nó cuối cùng đã xảy ra với tôi chỉ đơn giản là sử dụng ssh để thay đổi các điều khoản sau khi copy.

Đây là giải pháp:

  1. Sao chép tập tin của bạn: localhost$ scp filename remotehost:umask-test/filename
  2. Sửa giấy phép: localhost$ ssh remotehost "chmod go+r umask-test/filename"

Tốt nhất của tất cả, không có quyền truy cập root là cần thiết để thực hiện giải pháp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.