Дозволити SCP, але не фактичне вхід за допомогою SSH


62

Чи є спосіб налаштувати користувача у вікні Linux (у цьому випадку Centos 5.2), щоб він міг використовувати scp для отримання файлів, але насправді не може увійти на сервер за допомогою SSH?


Я спробував встановити оболонку входу на / bin / false, але це просто припиняє роботу scp взагалі.
DrStalker

Відповіді:


44

Оболонка rssh ( http://pizzashack.org/rssh/ ) створена саме для цієї мети.

Оскільки RHEL / CentOS 5.2 не включає пакет для rssh, ви можете подивитися тут, щоб отримати RPM: http://dag.wieers.com/rpm/packages/rssh/

Щоб використовувати його, просто встановіть його як оболонку для нового користувача, як це:

useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1

..або змінити оболонку на існуючу на зразок цієї:

chsh -s /usr/bin/rssh scpuser1

/etc/rssh.conf..і редагувати, щоб налаштувати оболонку rssh - особливо allowscpрядок нестандартності, щоб дозволити доступ SCP для всіх rssh користувачів.

(Ви також можете використовувати chroot, щоб утримувати користувачів, які містяться в їхніх будинках, але це вже інша історія.)


це дивовижно - Я щось саме таке шукав деякий час
warren

6
ідея rssh приємна, але iirc rssh не був саме чудом безпеки в плані програмування. Простий google на "rssh exploit" дає більше результатів, ніж мені подобається ...
wzzrd

7
scponly більш-менш те ж саме , як добре , і по- видимому , менш подвиги схильні: sublimation.org/scponly/wiki/index.php/Main_Page
Франсуа Feugeas

схоже, що Scponly перейшла до github. Сублімаційне посилання мертве. github.com/scponly/scponly/wiki
Spazm

38

Я до цього запізнююсь, але ви можете використовувати ключі ssh і вказати точну команду, дозволену у файлі ~ / .ssh / санкціонованих_кейсів, наприклад

no-port-forwarding, no-pty, command = "scp source target" ssh-dss ...

Можливо, вам потрібно буде використовувати ps для цілі, щоб встановити правильні параметри команди.

PS: Якщо ви запустите тестову команду scp з "-v", ви можете побачити щось подібне

debug1: Sending command: scp -v -t myfile.txt

Ви зауважите, що "-t" - це незадокументований scp варіант, який використовується програмою на дальньому кінці. Це дає вам уявлення про те, що потрібно помістити в дозволені_кейси.

РЕДАКТУВАННЯ: Ви можете знайти більше інформації (за кількома посиланнями) у цьому питанні щодо StackOverflow .

Ось робочий приклад цього для користувача, названого backup_userна стороні сервера.

~backup_user/.ssh/authorized_keys вміст на стороні сервера (з деякими іншими обмеженнями безпеки):

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...

Створіть посилання в ~ backup_user /, що посилається на каталог, де вміст повинен бути доступним.

$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT

Тепер з боку клієнта повинна працювати наступна команда:

scp -v  -r  -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT

Що робить ця команда:

  • У ньому відображається багатослівна інформація ( опціональний : ви можете видалити -vфайл із командного та дозволеного ключів )
  • Він рекурсивно копіює вміст шляху / до / даних. ( опціонально : ви можете видалити -rз файлу команд і авторизованих ключів, якщо ви не хочете робити рекурсивну копію)
  • Для підключення до сервера використовується порт 2222 ( опціональний варіант : ви можете видалити -P 2222з команди)
  • Він використовує і ідентифікаційний файл для автоматизації з'єднання ( опціональний варіант : ви можете видалити-i .ssh/id_rsa_key_file
  • Вміст path/to/dataбуде скопійовано у/path/to/directory/with/accessible/content/

Щоб зробити копію файлу (або декількох) з сервера на клієнта, слід створити сценарій оболонки, який обробляє це, як описано тут


1
Що зупиняє користувач надиратись на файл дозволених ключів? Чи можна обмежуватись, щоб не належати самим користувачеві?
Ден

1
@Dan - слід встановити дозволи лише для читання у файлі санкціонованих_кейсів, тобто. chmod 400 ~/.ssh/authorized_keys.
Роджер Дуек

Також ви повинні зробити ~/.bashrc(і все, що ще Bash виконує) і ~/.ssh/rcлише для читання. Але якщо шкідливий користувач має доступ до rsync або sftp, він все одно може видалити ~/.bashrcта завантажити новий. Оскільки важко захистити, я рекомендую проти цього способу ( command="...").
пт

31

Я трохи запізнююся на партію, проте запропоную вам поглянути на ForceCommandдирективу OpenSSH.

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

Звичайно, це SFTP, а не SCP, але він досягає тієї ж мети, більш безпечно, ніж з обмеженою оболонкою. Крім того, ви можете хронувати користувача, якщо хочете.


2
додайте розділ матчу chrootDirectory %hта AllowTcpForwarding noпісля нього, щоб змусити користувачів sftponly відкотитися додому. зауважте, що відповідність повинна (повинна бути!) останньою секцією в ssh config та параметри після цього - це варіанти лише для відповідних користувачів
higuita

4
ForceCommand internal-sftp -u 0077 -d /uploaddirможна ще більше загартувати, примушуючи umask у каталозі завантаження. У поєднанні з "ChrootDirectory" це створює дуже контрольоване, ізольоване середовище для завантаження. Примітка про бонус: дір за замовчуванням і umask повинні бути встановлені в ForceCommand, а не в Subsystemдирективі, якщо ви хочете, щоб вони працювали.
Марцін

Більш довга стаття, що пояснює це, доступна на сайті debian-administration.org/article/590/…
koppor

7

Я б рекомендував використовувати scponly.

Це обмежена оболонка, яка дозволяє користувачам робити лише те, що це звучить, файли SCP на сервері, але насправді не входити в систему. Завантаження інформації та вихідного коду для програмного забезпечення доступні тут, а попередньо складені пакети RPM доступні через Epel YUM репозиторіїв .

Після встановлення вам потрібно буде налаштувати кожен обліковий запис користувача, до якого ви хочете обмежити доступ, для використання нещодавно встановленої оболонки з обмеженнями. Це можна зробити вручну через / etc / passwd або скористатися такою командою: usermod -s /usr/bin/scponly USERNAME


Я другий це. scponlyрозроблений саме для цієї мети.
UtahJarhead

1
Scponly здається мертвою. Debian , здається, видалити його: packages.debian.org/search?keywords=scponly і код на GitHub мертвий, теж. Подальше
koppor


3

Дуже пізно на вечірку, але просто встановити оболонку користувача git бути / usr / bin / git-shell. Це обмежена оболонка, яка не дозволяє інтерактивне вхід. Ви все одно можете користуватися користувачем за допомогою "su -s / bin / bash git" або будь-якого вашого ім'я користувача git.


2

На наших захищених ftp-серверах ми використовуємо оболонку psudo, яку називають scponly, для користувачів, які ми хочемо лише мати можливість сканувати файли, але не входити в систему.


2

Я знайшов хороший спосіб - використовувати функцію command = "..." файлу санкціонованих_ ключів. (Пропонував мені цю сторінку )

Команда, яку ви виконуєте, буде тестувати аргументи, які починаються з scp (та rsync).

Ось файл із дозволеними ключами:

# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew

Ось вміст remote-cmd.sh:

#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
 'scp'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 'rsync'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 *)
    echo "Access Denied"
    ;;
esac

Я думаю, вам, мабуть, все-таки потрібно буде захистити файл дозволеного_кейса користувача, але моя мета полягала в тому, щоб мати ключ, не захищений паролем, який я міг би використовувати для створення резервних копій, не створюючи цілком нового користувача, і щоб ключ не давав оболонки (гаразд, легко)


3
Це досить круто - але я думаю, що це можна підірвати, видавши команду, яка робить scp, а потім запустити сценарій після цього!
davidgo

@davidgo заздалегідь напередодні $ SSH_ORIGINAL_COMMAND з exec може вирішити цю вразливість, якщо припустити, що scp та rsync самі не намагаються запустити кілька програм (у такому випадку це порушить це)
Філ

Крім того, ви повинні зробити ~/.ssh/authorized_keys, ~/.bashrc(і все, що ще Bash виконує) і ~/.ssh/rcлише для читання для користувача. Але якщо шкідливий користувач має доступ до rsync або sftp, він все одно може видалити ~/.bashrcта завантажити новий. Оскільки важко захистити, я рекомендую проти цього способу ( command="...").
пт

1
@pts ви можете зробити як rc-файли, так і файли, що їх містять, належати іншим, ніж користувач (ніхто?), а користувач не може їх записувати. Але в цей момент вам краще використовувати щось виділене, наприклад, rssh. Нічого собі, я просто зрозумів, що це моя відповідь! Це старе! Ха-ха!
Філ

Не забувайте, що scp -S ... і rsync -e ... дозволяє користувачеві виконувати довільні команди. Тому слід перевірити аргументи в $ SSH_ORIGINAL_COMMAND, перш ніж виконувати їх. Більше інформації тут: exploit-db.com/exploits/24795
пт

1

Змініть оболонку входу користувача на щось обмежувальне, що дозволяє користувачеві запускати лише scp , sftp-сервер та rsync , а також перевіряє, що небезпечні аргументи заборонені (наприклад, scp -S ... та rsync -e .. . небезпечні, дивіться тут: http://exploit-db.com/exploits/24795 ). Приклад такої обмежувальної оболонки для входу:

  • rssh
  • scponly (не тільки scp, але також дозволяє sftp, svn тощо, якщо так налаштовано)
  • transfer_shell

Ви можете запустити одну з них у chroot або в іншому обмеженому середовищі (наприклад, nsjail в Linux), щоб відключити доступ до мережі та для легшого (дозволеного) контролю, які каталоги можна читати та / або писати.

Я не рекомендую використовувати command="..."в ~/.ssh/authorized_keys, тому що без ретельної додаткового захисту (наприклад, chmod -R u-w ~для користувача) зловмисний користувач може завантажити нову версію ~/.ssh/authorized_keys, ~/.ssh/rcабо ~/.bashrc, і , таким чином , може включати в себе і виконувати довільні команди.


0

Це не найвибагливіше рішення, але ви можете кинути щось подібне у користувачів .bashrc

if [ "$TERM"  != "dumb" ]; then
  exit
fi

Я виявив, що користувачі SCP отримують термін "німий", а інші зазвичай отримують vt100.

Я думаю, що користувач, можливо, міг би розглянути новий .bashrc, що робить це не найкращим рішенням, але для швидкого та брудного рішення це працюватиме


1
Я настійно не рекомендую проти цього запропонованого рішення, тому шкідливий користувач занадто легко обійти (наприклад, завантаживши іншого ~/.bashrc). Це також лунає в тому сенсі, що, можливо, новіші версії OpenSSH зміняли б цю TERMзміну по-різному, або можуть вплинути деякі налаштування sshd TERM.
пт

1
Е-е-е ... ssh -o SetEnv TERM=dumb yourserver bash??
улідко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.