Пользователь имеет доступ только к одному файлу
Я работаю над устройством, которое имеет веб-интерфейс для настройки сети в безголовой системе Ubuntu. Первоначально система будет настроена для DHCP, но одной из начальных конфигураций будет применение к ней статического IP-адреса с использованием графического интерфейса.
Я уверен, что случится так, что, если они непреднамеренно отправят неверные настройки TCP/IP через графический интерфейс, устройство либо перезагрузит, либо перезапустит сетевые службы, но теперь пользователь не имеет доступа к графическому интерфейсу через браузер.
Я думаю о настройке пользователя Ubuntu "Network Disaster", чьи учетные данные известны конечному пользователю, который позволит им войти в систему только через сеанс терминала (клавиатура и монитор подключены к устройству).
Однако я хочу, чтобы у них был доступ к /etc/network/interfaces только после того, как они вошли в систему. В идеале они заблокированы в своей домашней папке (или, возможно, / etc / network настроена как их домашняя папка) и могут не перемещаться нигде в файловой системе. Единственный файл, к которому у них есть доступ для чтения / записи, - это файл интерфейсов.
Это возможно? Я читал много постов о настройке пользователей SSH и т. Д., Но не видел ничего об ограничении одного пользователя только его домашней папкой, и все...?
3 ответа
Если вы хотите, чтобы пользователь только мог видеть, иметь доступ и изменять один файл, vi на самом деле не вариант. Причина в том, что любой, кто использует vi, может сразу же зайти в оболочку внутри vi и запустить любые команды, которые ему нужны, особенно если они находятся в vi как root, что, безусловно, будет иметь место, если они редактируют /etc/network/interfaces
, Фактически, позволить им войти в систему и получить оболочку любого вида сразу же не достигнет вашей цели.
Вот решение из двух частей, которое я предлагаю вам попробовать:
Резюме:
- Разрешить пользователю sftp только определенный файл только в определенное место, не имея возможности получить любой другой вид оболочки.
- Создать и выполнить задание, которое автоматически проверяет изменения и условно копирует "новый" файл интерфейсов на место и перезапускает сеть.
Руководство:
Настройте пользователя, который может использовать протокол ssh только для приложений sftp. Принятый ответ в следующем посте отлично сработал для меня:
https://serverfault.com/questions/354615/allow-sftp-but-disallow-ssh
Заметки:
- Для удобства вы можете просто использовать имя sftponly для своего пользователя, так как группа sftponly будет сгенерирована автоматически
С помощью
/home/sftponly
в качестве домашнего каталога пользователей вполне приемлемо. Вот как выглядит мой пользователь в /etc/passwd:mgodby@mg-ws1:~$ grep sftponly /etc/passwd sftponly:x:1002:1002::/home/sftponly:/bin/false
Создать каталог вручную
/home/sftponly
от имени root и назначьте ему права доступа и права доступа, чтобы они выглядели так:mgodby@mg-ws1:/etc$ ls -l /home | grep sftponly drwxr-xr-x 2 root root 4096 Aug 27 16:07 sftponly
предварительно создать файл интерфейсов в
/home/sftponly
и измените разрешения, чтобы они выглядели так:mgodby@mg-ws1:~$ ls -l /home/sftponly total 4 -rw-rw-r-- 1 sftponly sftponly 95 Aug 27 16:14 interfaces
Теперь, когда мы создали пользователя, единственной возможностью которого является размещение файла с именем "interfaces" в определенном каталоге через sftp, нам нужна работа cron, которая автоматически поместит ваш новый
interfaces
файл в силу.- Создать скрипт где-нибудь (
/root
довольно безопасно для этого), сделайте его исполняемым и вставьте в него содержимое, найденное здесь: newnet.sh Создайте задание cron, которое запускает скрипт каждую минуту. Вот как будет выглядеть запись в crontab, если я назову свой скрипт
newnet.sh
и поместил его в/root
каталог:* * * * * /root/newnet.sh
- Это раскрутит задание cron, которое автоматически проверяет
/home/sftponly/interfaces
каждую 1 минуту для различий с/etc/network/interfaces
, Если обнаружены какие-либо различия, будет скопировано новоеinterfaces
файл на место и перезапустите все управляемые сетевые интерфейсы.
- Создать скрипт где-нибудь (
Дайте мне знать, если это решение приемлемо для вас.
Ограничьте их вход в систему TTY, используя /etc/security/access.conf
:
-:poor_user:ALL EXCEPT tty1 tty2 # Other ttys if needed.
Напишите пользовательскую оболочку, которая открывает только редактор (и слабый редактор):
//file: poor_shell.c
#include <unistd.h>
int main(void)
{
execl("/usr/bin/nano", "nano", "/etc/network/interfaces", NULL);
}
Скомпилируйте, сделайте это setuid
корень (или сделать /etc/network/interfaces
возможность записи в группу и установите для ее группы значение poor_user
группа):
gcc -o poor_shell poor_shell.c
chown root:root poor_shell
cp poor_shell /bin
# Either
chmod u+s /bin/poor_shell
# Or:
chown root:poor_user /etc/network/interfaces
chmod g+w /etc/network/interfaces
И установите оболочку этого пользователя на /bin/poor_shell
:
chsh poor_user /bin/poor_shell
Вы не упоминаете, хотите ли вы запретить им просматривать другие файлы, так что это может сработать для вас.
Sudo позволяет вам определить запись в файле sudoers, которая позволит определенному непривилегированному пользователю выполнить определенную команду с конкретными аргументами с повышенными привилегиями.
# joe may su only to operator
joe ALL = /usr/bin/su operator
Кажется, что-то подобное поможет вам;
joe ALL = /bin/vi /etc/network/interfaces
или даже лучше
joe ALL = /bin/vi /etc/network/interfaces.d/eth0.cfg