Як налаштувати ssh's umask для всіх типів з'єднань


34

Я шукав спосіб настройки в OpenSSH UMASK до 0027послідовним чином у всіх типах з'єднань.

За типом з'єднання я маю на увазі:

  1. sftp
  2. scp
  3. ssh ім'я хоста
  4. ssh програма імені хоста

Різниця між 3. і 4. полягає в тому, що перший запускає оболонку, яка зазвичай читає /etc/profileінформацію, а друга - ні.

Крім того, прочитавши цю публікацію, мені стало відомо про параметр -u, який присутній у нових версіях OpenSSH. Однак це не працює.

Я також повинен додати, що /etc/profileзараз включає umask 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 - незалежно від того, що налаштовано для sftp , дозволи завжди є umask 0022. Наразі я не маю уявлення, як це змінити.

  • ssh ім'я хоста - тут немає жодних проблем, оскільки оболонка читається /etc/profileза замовчуванням, що означає umask 0027в поточній установці.

  • Програма ssh hostname - така ж ситуація, як і scp .


Підсумовуючи, встановлення umask на sftpзміну результату, але не так, як слід, ssh hostnameпрацює як очікуване читання, /etc/profileі те, і інше, scpі, ssh hostname programздається, umask 0022десь жорстко закодовано.

Будь-яке розуміння будь-якого з вищезазначених моментів вітається.

EDIT: Я хотів би уникати патчів, які вимагають вручну компілювати opensh. У системі працює Ubuntu Server 10.04.01 (зрозумілий) LTS з opensshпакетами від maverick.

Відповідь: Як вказує 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.

EDIT : Після деяких коментарів я повторно перевірив це питання.

Принаймні, в Ubuntu (де я тестував) здається, що якщо користувач має інший umask, встановлений у файлах init своїх оболонок (.bashrc, .zshrc, ...), PAM umask ігнорується і замість нього використовується визначений користувачем umask. Зміни /etc/profileне вплинули на результат, якщо користувач не надав явних джерел цих змін у файлах init.

На даний момент незрозуміло, чи трапляється така поведінка у всіх дистрибутивах.


Unode: "Я хотів би уникати виправлень, для яких потрібно вручну компілювати opensh." Чому?
— desasteralex

5
@desasteralex - Тому що (якщо це можливо) я хотів би уникати додаткових завдань з обслуговування / адміністрування, які поставляються з пакетами, що базуються на джерелах, і тому, що мені важко повірити, що немає іншого способу змінити umask, крім патчу opensh. Спеціально з огляду на це досить базовий аспект безпеки в будь-якій системі.
— Unode

1
Після зміни /etc/pam.d/sshd (та входу в систему) та перезавантаження ssh я не бачу зміни в поведінці. Чи маються на увазі інші необхідні зміни, але тут не згадується?
— Стів Клей

@mrclay - Чи є UsePAM yesу вас sshd_config?
— Unode

1
Щоб вирішити проблему .bashrc користувача, спробуйте відключити команду umask у вашому /etc/profile. Щось на кшталтalias umask=/bin/true
— Tobia

Відповіді:


22

Я можу запропонувати спробувати 2 речі:

  1. pam_umask
  2. Обгортка LD_PRELOAD (самозапис?)

1
+1, здається, пам_umask є найпростішим рішенням
— Flexo

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 для випадків, коли пам не можна використовувати.
— 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.

Метод обгортки також нічого не робить для sftp або scp. Я не впевнений, що 027 - хороший приклад, оскільки більшість дистрибутивів уже встановили цей умаск. Спробуйте з 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 вище:

Це може бути само собою зрозумілим, але якщо ви не використовуєте пакунок opensh-сервера , а ви склали 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

Я щойно перевірив можливе вдосконалення параметрів srsd_config на larsks на 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"

Найкраще, що для доступу до цього рішення не потрібен кореневий доступ.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.