Вопрос № 1
Мой вопрос, как я ограничиваю команду просто этой передачей SFTP в открытом ключе, который сгенерирован?
Существует 2 метода для того, чтобы сделать это.
1. - Ограничивающий через sshd
Этот метод включает установку функции SFTP в Вашем демоне SSH,
sshd
. Этим управляют через/etc/ssh/sshd_config
конфигурационный файл.Примечание: Это ограничит пользователя,backup
только быть позволенным SFTP в сервер.# /etc/ssh/sshd_config Subsystem sftp internal-sftp ## You want to put only certain users (i.e users who belongs to sftpusers ## group) in the chroot jail environment. Add the following lines at the end ## of /etc/ssh/sshd_config Match User backup ForceCommand internal-sftp
2. - Ограничивающий через authorized_keys
Этот метод не включает изменений в
sshd_config
файл. Можно ограничить пользователя + ключ SSH к единственной команде черезcommand=
функция, которую Вы уже упомянули в своем вопросе. Прием находится, в какую команду Вы включаете. Можно поместить сервер SFTP в этоcommand=
строка, которая имеет тот же эффект как установка сервера SFTP в Вашемsshd_config
файл.# User backup's $HOME/.ssh/authorized_keys file command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host
Примечание: если у пользователя есть доступ для записи к
~/.ssh/authorized_keys
, они могут считать и/или изменить его. Например, они могли загрузить его, отредактировать его и повторно загрузить его, снявcommmand=...
, предоставление ему освобожденный доступ команды, включая оболочку. Если у пользователя есть доступ для записи к~/.ssh
, они могли также просто удалить связь и воссоздать файл, илиchmod
это к доступу для записи. Много возможных решений существуют, такие как помещение~/.ssh/authorized_keys
подпиливает в месте non-user-writable, такой как с:Match Group sftponly AuthorizedKeysFile /etc/ssh/authorized_keys/%u
Вопрос № 2
И так как я нахожусь на динамическом IP-адресе, как я преодолеваю "недостающий известный хост" проблема каждый раз мои изменения IP?
Это - более хитрое но выполнимое использование
from=
функция вauthorized_keys
файл также. Здесь мы ограничиваем доступ только от хоста,somehost.dyndns.org
.от = "somehost.dyndns.org", управляйте = "/usr/libexec/openssh/sftp-server", без перенаправления портов, no-X11-forwarding, no-agent-forwarding, ssh-dss AAAAC8ghi9ldw без имуществ == backup@host
Дополнительные настройки после
command=
одинаково важны, так как они ограничат использование ключа SSH еще больше.разбивка функций
from='hostname1,hostname2,''
- Ограничивает доступ в указанном IP или шаблонах имени хостаcommand='command'
- Выполняет указанную команду после аутентификацииno-pty
- Не выделяет имущество (не позволяет интерактивный вход в систему),no-port-forwarding
- Не позволяет перенаправление портовno-X11-forwarding
- пользователь не сможет удалить дисплей графический интерфейсы пользователя X11no-agent-forwarding
- пользователь не сможет передать через этот хост других внутренних узловДля избавлений от сообщения о "недостающих известных хостах", можно добавить эту опцию SSH к клиенту, когда это соединяется как так:
$ ssh -o StrictHostKeyChecking=no ....
См. страницу справочника,
ssh_config
для полного изложения об этом переключателе.Ограничение оболочки пользователя
Для обоих решений выше Вы, вероятно, захотите заблокировать вниз
backup
пользователь путем ограничения оболочки этого пользователя в/etc/passwd
файл также. Обычно Вы захотите установить его наscponly
, но существует другой выбор для этого также. Посмотрите это названные Вопросы и ответы U&L: "Вам нужна оболочка для SCP?" для способов сделать это.Использование
/sbin/nologin
может также использоваться, если Вы решили использовать chroot функцию отsshd_config
как обрисовано в общих чертах в № 1 выше. Однако, если Вы решили использовать метод, обрисованный в общих чертах в № 2, затем необходимо будет, вероятно, использоватьscponly
или что-то еще для оболочки пользователя в/etc/passwd
.ПРЕМИЯ - расширяющийся № 2 выше
Если необходимо выставить ряд команд для этого пользователя, можно также сделать это. Создайте сценарий как так,
/home/backup/commands.sh
:#!/bin/sh case $SSH_ORIGINAL_COMMAND in "diskspace") df -h ;; "dirlist") ls -1 ;; "apache_restart") /etc/init.d/apache restart ;; *) echo "Unknown command" esac
Вы затем устанавливаете
authorized_keys
файл как так:command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
backup
пользователь может затем выполнить эти команды как так:# diskspace $ ssh -q user@remote_host diskspace Filesystem Size Used Avail Use% Mounted on /dev/mapper/dev-root 39G 2.2G 35G 6% / # dirlist $ ssh -q remote_host dirlist commands.sh dump.sql
Ссылки
Теперь, если необходимость основывать имена выходных файлов на содержимом файлов может быть удалена, то coreutils csplit может быть быстрее, чем awk
csplit file '/^Record[|]/' '{*}'
Это создаст набор файлов xx01
, xx02
и т.д. и так далее. Вы можете игнорировать файл xx01
, так как в вашем случае он будет пустым. Также обратите внимание, что csplit
позволяет настроить префикс (xx
) и суффикс (01
, 02
....) части имён выходных файлов
Используя GNU awk, вы можете попробовать:
gawk -v RS='Record[|]' -F'|' '$1{printf "%s%s", RT, $0 > $1}' file
С Record|
в качестве разделителя записей , мы можем легко получить каждую запись. GNU awk RS
может быть регулярным выражением (как в данном случае), а RT
содержит текст, который соответствовал этому выражению (Record|
).
С mawk
, RT
недоступен, поэтому вместо него можно использовать printf "Record|%s", $0
.