Как настроить smas's umask для всех типов соединений
Я искал способ настроить Umask OpenSSH для 0027
согласованно для всех типов соединений.
По типам подключения я имею в виду:
- SFTP
- УПП
- имя хоста ssh
- программа ssh hostname
Разница между 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.
В общем, постановка масок на sftp
изменяет результат, но не так, как следует, ssh hostname
работает как ожидаемое чтение /etc/profile
и оба scp
а также ssh hostname program
кажется umask 0022
где-то жестко
Любое понимание любого из вышеперечисленных пунктов приветствуется.
РЕДАКТИРОВАТЬ: Я хотел бы избежать патчей, которые требуют ручной компиляции openssh. Система работает под управлением Ubuntu Server 10.04.01 (lucid) 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 в файлах инициализации его оболочки (.bashrc, .zshrc,...), umask PAM игнорируется и вместо него используется пользовательский umask. Изменения в /etc/profile
не повлияло на результат, если пользователь явно не внес эти изменения в файлы инициализации.
Пока неясно, происходит ли такое поведение во всех дистрибутивах.
10 ответов
Я могу предложить попробовать 2 вещи:
- pam_umask
- Оболочка LD_PRELOAD (написана самостоятельно?)
Вот решение, которое позволит вам делать то, что вы хотите для каждого пользователя. Он использует только родной 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
И там у вас есть это. Я считаю, что это поведение, которое вы искали. Если у вас есть какие-либо вопросы об этом решении, я был бы рад предоставить дополнительную информацию.
Я выбрал немного другой подход для централизации настроек.
Это было добавлено к /etc/pam.d/common-session
:
session optional pam_umask.so
Это было изменено в /etc/login.defs
:
UMASK 0027
Я получил pam_umask для работы с ssh, но не с scp или sftp.
Метод обертки также ничего не делает для sftp или scp. Я не уверен, что 027 - хороший пример, так как большинство дистрибутивов уже настроили umask на это. Попробуйте с 002 и посмотрите, работает ли это.
Поскольку 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
Если pam_umask
не влияет на ваши сеансы SFTP, затем проверьте, если UsePam
установлен в Yes
в /etc/ssh/sshd_config
файл.
Если вы отключили аутентификацию по паролю и UsePam
был установлен или по умолчанию No
, Вы можете установить ChallengeResponseAuthentication No
в sshd_config
файл, потому что в противном случае вы можете случайно включить аутентификацию по паролю через эту систему.
Программы, которые не устанавливают собственный umask, наследуют umask приложения, которое его запустило. Полностью остановите sshd, установите umask на 0027, затем запустите его снова. (Вы можете добавить команду umask в сценарий инициализации для будущих перезагрузок.)
Проверено на работу с scp.
Добавленная заметка к ответу пользователя 188737 выше:
Это может быть само собой разумеющимся, но если вы не используете пакет openssh-server и скомпилировали OpenSSH вручную, убедитесь, что вы "включили поддержку PAM", передав --with-pam
флаг конфигурации.
Иначе, UsePAM=yes
в sshd_config, плюс любые изменения в /etc/pam.d/*
будет эффективно игнорироваться sshd
,
В конце концов меня осенило, почему ни одно из рекомендуемых решений PAM не оказывало никакого влияния на тестирование через неинтерактивные SFTP-соединения...
Я только что проверил возможное улучшение параметров larsks sshd_config на солярисе 11
Настройте группу с пользователями, которыми нужно управлять, и переместите сценарий в сам файл конфигурации, в моем случае я хотел установить значение umask 0002.
результирующая конфигурация становится....
Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'
Я боролся с этой проблемой, особенно с правами доступа к файлам после копирования файла с использованием scp, и мне наконец пришло в голову просто использовать ssh для изменения прав доступа после копирования.
Вот решение:
- Скопируйте ваш файл:
localhost$ scp filename remotehost:umask-test/filename
- Исправить разрешение:
localhost$ ssh remotehost "chmod go+r umask-test/filename"
Лучше всего то, что для реализации этого решения не нужен root-доступ.