Cara mengatur umsh ssh untuk semua jenis koneksi

34

Saya telah mencari cara untuk setup OpenSSH umask untuk 0027secara konsisten di semua jenis koneksi.

Berdasarkan jenis koneksi yang saya maksudkan:

  1. sftp
  2. scp
  3. ssh nama host
  4. program nama host ssh

Perbedaan antara 3. dan 4. adalah bahwa yang pertama memulai sebuah shell yang biasanya membaca /etc/profileinformasi sementara yang terakhir tidak.

Selain itu dengan membaca posting ini saya menjadi sadar akan opsi -u yang hadir dalam versi OpenSSH yang lebih baru. Namun ini tidak berhasil.

Saya juga harus menambahkan itu /etc/profilesekarang termasuk umask 0027.

Poin demi poin:

  • sftp - Pengaturan -u 0027di sshd_configseperti yang disebutkan di sini , tidak cukup.

Jika saya tidak mengatur parameter ini, sftp menggunakan secara default umask 0022. Ini berarti bahwa jika saya memiliki dua file:

-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

Ketika saya menggunakan sftp untuk meletakkannya di mesin tujuan, saya benar-benar mendapatkan:

-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

Namun ketika saya mengatur -u 0027pada sshd_configmesin tujuan saya benar-benar mendapatkan:

-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

yang tidak diharapkan, karena sebenarnya harus:

-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

Adakah yang mengerti mengapa ini terjadi?

  • scp - Secara independen dari apa yang diatur untuk sftp , izin selalu umask 0022. Saat ini saya tidak tahu bagaimana cara mengubahnya.

  • ssh hostname - tidak ada masalah di sini karena shell membaca /etc/profilesecara default yang berarti umask 0027dalam pengaturan saat ini.

  • ssh hostname program - situasi yang sama dengan scp .


Singkatnya, menetapkan umask pada sftpmengubah hasil tetapi tidak sebagaimana mestinya, ssh hostnamebekerja seperti yang diharapkan membaca /etc/profiledan keduanya scpdan ssh hostname programtampaknya telah di- umask 0022hardcode di suatu tempat.

Setiap wawasan tentang salah satu poin di atas dipersilahkan.

EDIT: Saya ingin menghindari tambalan yang memerlukan kompilasi openssh secara manual. Sistem ini menjalankan Ubuntu Server 10.04.01 (lucid) LTS dengan opensshpaket - paket dari maverick.

Jawaban: Seperti yang ditunjukkan oleh poige, menggunakan pam_umask melakukan trik.

Perubahan pastinya adalah:

Baris ditambahkan ke /etc/pam.d/sshd:

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

Juga, untuk mempengaruhi semua shell login terlepas dari apakah mereka sumber /etc/profileatau tidak, baris yang sama juga ditambahkan /etc/pam.d/login.

EDIT : Setelah beberapa komentar saya menguji ulang masalah ini.

Setidaknya di Ubuntu (tempat saya menguji) tampaknya jika pengguna memiliki set umask berbeda dalam file init shell mereka (.bashrc, .zshrc, ...), umas PAM diabaikan dan umask yang ditetapkan pengguna digunakan sebagai gantinya. Perubahan tidak /etc/profilemempengaruhi hasil kecuali jika pengguna secara eksplisit sumber perubahan tersebut di file init.

Tidak jelas pada titik ini apakah perilaku ini terjadi di semua distro.

Batalkanode
sumber
Unode: "Saya ingin menghindari tambalan yang memerlukan kompilasi openssh secara manual." Mengapa?
desasteralex
5
@desasteralex - Karena (jika mungkin) saya ingin menghindari tugas pemeliharaan / administrasi tambahan yang disertai dengan paket berbasis sumber dan karena saya merasa sulit untuk percaya bahwa tidak ada cara lain untuk mengubah umask selain menambal openssh. Mempertimbangkan secara khusus ini adalah aspek keamanan yang agak mendasar pada sistem apa pun.
Unode
1
Setelah mengubah /etc/pam.d/sshd (dan login), dan memulai kembali ssh, saya tidak melihat perubahan perilaku. Apakah ada perubahan lain yang diperlukan tetapi tidak disebutkan di sini?
Steve Clay
@ mrclay - Apakah ada UsePAM yesdi sshd_config Anda?
Unode
1
Untuk memecahkan masalah .bashrc pengguna, coba aliasing perintah umask di /etc/profile. Sesuatu sepertialias umask=/bin/true
Tobia

Jawaban:

22

Saya dapat menyarankan mencoba 2 hal:

  1. pam_umask
  2. Pembungkus LD_PRELOAD (ditulis sendiri?)
poige
sumber
1
+1, pam_umask tampaknya menjadi solusi paling sederhana
Flexo
pam_umask melakukan trik. Pertanyaan yang diedit untuk mencerminkan dan menguraikan jawaban
Unode
Cukup gunakan stackoverflow.com/q/10220531/220060 . Namun hati-hati, jika Anda salah mengetik sesuatu, Anda mengunci diri sendiri keluar dari server. Selalu periksa apakah Anda dapat login lagi sebelum menutup sesi Anda saat ini.
nalply
1
Selain komentar oleh @nalply: Pastikan untuk memiliki cadangan akar sesi terbuka, karena melanggar berarti PAM Anda tidak akan dapat sudoatau sudo suatau sejenisnya.
Zero3
13

Berikut adalah solusi yang akan memungkinkan Anda melakukan apa yang Anda inginkan berdasarkan per pengguna. Ini hanya menggunakan sshdfitur asli dan tidak perlu mucking dengan tambalan yang dikelola secara lokal. Solusi ini memanfaatkan ForceCommandperilaku sshd untuk menyisipkan skrip pengaturan lingkungan ke setiap koneksi ssh, dan kemudian menjalankan perintah asli.

Pertama, buat skrip di suatu tempat di sistem Anda dengan konten berikut:

#!/bin/sh

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

Untuk keperluan contoh ini saya akan menganggap Anda telah memanggil ini /usr/bin/umask-wrapper.

Sekarang, Anda memiliki beberapa opsi dalam pengaturan ini. Jika Anda ingin ini menjadi konfigurasi wajib untuk semua pengguna (yang tampaknya agak tidak mungkin), Anda dapat memodifikasi konfigurasi sshd Anda dengan memasukkan yang berikut:

ForceCommand /usr/bin/umask-wrapper

Jika Anda hanya ingin ini berlaku untuk beberapa pengguna, Anda dapat menggunakan Matchblok (ini berlaku di akhir Anda sshd_config):

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

Jika Anda ingin ini menjadi perilaku yang dapat dikontrol pengguna, maka Anda dapat menggunakan command=opsi dalam authorized_keyfile untuk memilih perilaku ini untuk kunci tertentu. Misalnya, saat menguji ini saya menambahkan entri ke authorized_keysfile saya yang terlihat seperti ini:

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

Dan inilah beberapa hasil tes saya:

Menggunakan sshtanpa perintah:

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

Menggunakan sshdengan perintah:

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

Menggunakan 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

Menggunakan 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

Dan begitulah. Saya percaya ini adalah perilaku yang Anda cari. Jika Anda memiliki pertanyaan tentang solusi ini, saya akan dengan senang hati memberikan rincian tambahan.

larsks
sumber
Meskipun metode ini tampaknya berhasil, ini terlihat seperti mimpi buruk pemeliharaan. Namun, +1 untuk kasus di mana pam tidak dapat digunakan.
Unode
3
Saya tidak tahu bahwa semua itu sulit dipertahankan. Keuntungan utama daripada solusi berbasis PAM adalah tidak memerlukan hak istimewa khusus - Anda dapat mengaturnya untuk akun Anda sendiri tanpa campur tangan administrator.
larsks
Saya sedang berpikir dalam hal menjaga daftar pengguna yang dipilih, tetapi memang saya tidak memperhatikan aspek ini bekerja pada pengaturan pengguna biasa. Ketika saya pertama kali membacanya saya pikir ForceCommand "diperlukan" dan bukan "satu cara untuk mengaturnya". command=memang fitur yang rapi dari ssh.
Unode
5

Saya mengambil pendekatan yang sedikit berbeda untuk memusatkan pengaturan.

Ini ditambahkan ke /etc/pam.d/common-session:

session    optional     pam_umask.so

Ini diubah dalam /etc/login.defs:

UMASK           0027
Ekevoo
sumber
2

Saya sudah mendapatkan pam_umask untuk bekerja dengan ssh, tetapi tidak dengan scp atau sftp.

Metode wrapper juga tidak melakukan apa pun untuk sftp atau scp. Saya tidak yakin 027 adalah contoh yang baik karena sebagian besar distro telah mengatur umask untuk itu. Coba dengan 002 dan lihat apakah itu berhasil.

Tim
sumber
1

Program yang tidak mengatur umask mereka sendiri mewarisi umask dari aplikasi yang memulai itu. Hentikan sshd sepenuhnya, atur umask Anda ke 0027, lalu mulai lagi. (Anda dapat menambahkan perintah umask di skrip init untuk reboot selanjutnya.)

Diuji untuk bekerja dengan scp.

DerfK
sumber
Maaf DerfK tetapi ini adalah salah satu hal pertama yang saya coba tanpa hasil. Semua shell login memiliki umask 0027(jika mereka membaca /etc/profile) tetapi restart ssh tidak mempengaruhi scp atau ssh.
Unode
1

Jika pam_umasktampaknya tidak mempengaruhi sesi SFTP Anda, maka periksa apakah UsePamdiatur ke Yesdalam /etc/ssh/sshd_configfile.

Jika Anda telah menonaktifkan otentikasi kata sandi dan UsePamditetapkan atau tidak diubah ke No. Anda mungkin ingin mengatur ChallengeResponseAuthentication Nodalam sshd_configfile karena jika tidak, Anda dapat secara tidak sengaja mengaktifkan otentikasi kata sandi melalui sistem itu.

pengguna188737
sumber
1

Catatan tambahan untuk jawaban pengguna188737 di atas:

Ini mungkin tidak perlu dikatakan, tetapi jika Anda tidak menggunakan paket openssh-server , dan telah secara manual mengkompilasi OpenSSH, pastikan Anda "Aktifkan dukungan PAM" dengan melewati --with-pamflag konfigurasi.

Jika tidak, UsePAM=yesdi sshd_config, ditambah perubahan apa pun untuk /etc/pam.d/*secara efektif akan diabaikan oleh sshd.

Akhirnya saya sadar mengapa tidak ada solusi PAM yang direkomendasikan yang mempengaruhi pengujian melalui koneksi SFTP non-interaktif ...

Mike Reid
sumber
1

Karena umask diwarisi dari proses induk, pada sistem Slackware yang digunakan /etc/rc.d/rc.sshduntuk memulai / menghentikan / memulai kembali sshd, Anda dapat dengan mudah menempatkannya umask 0027pada baris langsung di atas "sshd_start" atau "sshd_restart", atau sebagai alternatif, pada titik mana pun sebelum bagian eksekusi utama dimulai, di /etc/rc.d/rc.sshd:

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

Atau, sebagai alternatif, di bagian atas file:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027
David J. Pryke
sumber
0

Saya baru saja menguji kemungkinan peningkatan opsi larsks sshd_config pada solaris 11

Setup grup dengan pengguna yang akan dikelola dan pindahkan skrip ke file konfigurasi itu sendiri, dalam kasus saya saya ingin mengatur umask ke 0002.

konfigurasi yang dihasilkan menjadi ....

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

Saya telah bergumul dengan masalah ini, khususnya dengan izin file setelah menyalin file menggunakan scp , dan akhirnya saya sadar untuk hanya menggunakan ssh untuk mengubah izin setelah salinan.

Ini solusinya:

  1. Salin file Anda: localhost$ scp filename remotehost:umask-test/filename
  2. Perbaiki izin: localhost$ ssh remotehost "chmod go+r umask-test/filename"

Terbaik dari semua, tidak ada akses root diperlukan untuk mempengaruhi solusi ini.

taranaki
sumber