Обмежте резервне копіювання без пароля за допомогою SFTP


11

Мені потрібно виконати резервне копіювання сервера на комп’ютері за допомогою Duplicity:

duplicity /etc sftp://backup@my.dynamic.ip.address//home/backup

Перш ніж це зробити, мені потрібно дозволити доступ без пароля, виконуючи наступні дії:

$ ssh-keygen
$ ssh-copy-id backup@my.dynamic.ip.address
$ ssh backup@my.dynamic.ip.address

Моє запитання полягає в тому, як я обмежую команду лише цією передачею SFTP у відкритому відкритому ключі?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

А оскільки я перебуваю на динамічній IP-адресі, як я можу подолати проблему "відсутній відомий хост" щоразу, коли мій IP-адрес змінюється?



1
"відсутня відома проблема хоста": використовуйте StrictHostKeyChecking = немає варіанту для ssh
Marki

@Marki, дякую, встановивши, що на ssh_config працює.
Переповнення запитань

Відповіді:


15

Питання 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. - Обмеження через санкціоновані_кількі

Цей метод не передбачає змін у 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файлів у непридатне для запису користувачеві місце, наприклад:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Питання №2

А оскільки я перебуваю на динамічній IP-адресі, як я можу подолати проблему "відсутній відомий хост" щоразу, коли мій IP-адрес змінюється?

Це складніше, але можливо також використовувати from=функцію у authorized_keysфайлі. Тут ми обмежуємо доступ від тільки господаря, somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-сервер", переадресація без порту, перенаправлення no-X11, переадресація no-агента, no-pty ssh-dss AAAAC8ghi9ldw == резервне копіювання @ хост

Додаткові параметри після цього command=не менш важливі, оскільки вони ще більше обмежать використання ключа SSH.

розбивка функцій

  • from='hostname1,hostname2,'' - Обмежує доступ із заданих шаблонів IP або імені хоста
  • command='command' - Запускає вказану команду після аутентифікації
  • no-pty - не виділяє pty (не дозволяє інтерактивний вхід)
  • no-port-forwarding - Не дозволяє переадресацію портів
  • no-X11-forwarding - користувач не зможе видалити графічні інтерфейси X11
  • no-agent-forwarding - користувач не зможе переслати цей хост на інші внутрішні хости

Щоб позбутися повідомлення про "відсутніх відомих хостів", ви можете додати цю опцію SSH до клієнта, коли він з'єднується так:

$ ssh -o StrictHostKeyChecking=no ....

ssh_configПовні відомості про цей перемикач див. На сторінці чоловіка .

Обмеження оболонки користувача

Для обох рішень вище, ймовірно, ви хочете заблокувати backupкористувача, обмеживши також оболонку цього користувача у /etc/passwdфайлі. Зазвичай ви хочете встановити його scponly, але для цього є й інші варіанти. Дивіться це питання U&L Q&A під назвою: " Вам потрібна оболонка для 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

Список літератури


Будьте уважні до того, які команди ви дозволяєте користувачеві отримувати доступ, або користувач може мати можливість отримати повну оболонку. Наприклад, якщо ви надаєте комусь доступ до vim, він міг легко:! / Bin / bash або:! / Bin / someotherprogram.
rking

@ rking - так, само собою зрозуміло ...
slm

Дякую, що дали мені таку детальну відповідь. Обмеження команди працює ідеально. Але є дві проблеми. 1) Динамічний ip стосується мого комп'ютера, а не сервера. Імена хостів у полі "від" файлу санкціонованих ключів лише обмежують адресу, з якої сервер може отримати доступ до мого комп'ютера, і нічого не роблять для вирішення проблеми "відсутній відомий хост" на моєму комп'ютері. 2) Вимкнення входу в оболонку для резервного користувача на моєму комп’ютері /sbin/nologinзаважає серверу отримати доступ до мого комп'ютера за допомогою SFTP. Це я спробував.
Переповнення запитань

1
Вибачте за непорозуміння. Сервер S стає клієнтом, коли він робить підключення SFTP до мого комп'ютера C. Проблема "відсутній відомий хост" виникає щоразу, коли сервер S, який робить резервну копію, підключається до місця, не вказаного у known_hostsфайлі ssh . Маркі надав правильне рішення у своєму коментарі. fromПараметр в authorized_keysфайл на моєму комп'ютері C обмежує тільки місце , з якого S можна підключити до С.
Питання переповнення

Так, будь ласка, продовжте редагування. До речі, я розумію, що /sbin/nologinпрацює, якщо я використовую команду force, internal-sftpзамість /usr/libexec/openssh/sftp-serverякої ви вказали на cert. Я думаю, це дві різні підсистеми. І створити каталог chroot для першого набагато прямо.
Переповнення запитань

0

Обмежена оболонка

Вам потрібно присвоїти оболонці з обмеженими можливостями, наприклад scponly або rssh.

Коли ви використовуєте scp або sftp, ви підключаєтесь до віддаленого сайту через ssh, а потім віддалений оболонка виконує процес scp-обробки або sftp. Вам потрібна обмежена оболонка, яка дозволяє лише scp або sftp блокувати вхід.

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