Я искал способ настроить OpenSSH маска к 0027
единообразно для всех типов подключения.
По типам подключения я имею в виду:
Разница между 3. и 4. заключается в том, что первый запускает оболочку, которая обычно читает /etc/profile
информация, а последний - нет.
Кроме того, прочитав эта почта Мне стало известно о параметре -u, который присутствует в новых версиях OpenSSH. Однако это не работает.
Я также должен добавить, что /etc/profile
теперь включает umask 0027
.
По пунктам:
-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 имя хоста программа - такая же ситуация как scp.
В общем, установка umask на sftp
изменяет результат, но не так, как должно, ssh hostname
работает как ожидалось чтение /etc/profile
и оба scp
и ssh hostname program
кажется umask 0022
где-то жестко запрограммирован.
Любое понимание любого из вышеперечисленных вопросов приветствуется.
РЕДАКТИРОВАТЬ: Я бы хотел избежать патчей, требующих ручной компиляции openssh. В системе работает Ubuntu Server 10.04.01 (lucid) 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
.
РЕДАКТИРОВАТЬ: После некоторых комментариев я повторно протестировал эту проблему.
По крайней мере, в Ubuntu (где я тестировал) кажется, что если у пользователя установлена другая маска umask в файлах инициализации оболочки (.bashrc, .zshrc, ...), umask PAM игнорируется и вместо этого используется umask, заданный пользователем. Изменения в /etc/profile
не повлияет на результат, если пользователь явно не внесет эти изменения в файлы инициализации.
На данный момент неясно, происходит ли такое поведение во всех дистрибутивах.
Я могу предложить попробовать 2 вещи:
Вот решение, которое позволит вам делать то, что вы хотите для каждого пользователя. Использует только родной 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, наследуют umask приложения, которое их запустило. Полностью остановите sshd, установите umask на 0027, затем запустите его снова. (Вы можете добавить команду umask в сценарий инициализации для будущих перезагрузок.)
Протестировано для работы с scp.
Если pam_umask
не влияет на ваши сеансы SFTP, затем проверьте, UsePam
установлен на Yes
в /etc/ssh/sshd_config
файл.
Если вы отключили аутентификацию по паролю и UsePam
был установлен или по умолчанию No
. Вы можете установить ChallengeResponseAuthentication No
в sshd_config
файл, потому что в противном случае вы можете случайно включить аутентификацию по паролю через эту систему.
Добавленное примечание к ответу user188737 выше:
Это может быть само собой разумеющимся, но если вы не используя openssh-сервер пакет и иметь вручную скомпилированный OpenSSH, убедитесь, что вы "Включить поддержку PAM", передав --with-pam
флаг конфигурации.
В противном случае, UsePAM=yes
в sshd_config плюс любые изменения в /etc/pam.d/*
будет эффективно игнорироваться sshd
.
Наконец меня осенило, почему ни одно из рекомендуемых решений PAM не имело никакого влияния на тестирование через неинтерактивные соединения SFTP ...
Поскольку 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
Я только что протестировал возможное улучшение параметров larsks sshd_config на solaris 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-доступ.