Пользователь имеет доступ только к одному файлу

Я работаю над устройством, которое имеет веб-интерфейс для настройки сети в безголовой системе Ubuntu. Первоначально система будет настроена для DHCP, но одной из начальных конфигураций будет применение к ней статического IP-адреса с использованием графического интерфейса.

Я уверен, что случится так, что, если они непреднамеренно отправят неверные настройки TCP/IP через графический интерфейс, устройство либо перезагрузит, либо перезапустит сетевые службы, но теперь пользователь не имеет доступа к графическому интерфейсу через браузер.

Я думаю о настройке пользователя Ubuntu "Network Disaster", чьи учетные данные известны конечному пользователю, который позволит им войти в систему только через сеанс терминала (клавиатура и монитор подключены к устройству).

Однако я хочу, чтобы у них был доступ к /etc/network/interfaces только после того, как они вошли в систему. В идеале они заблокированы в своей домашней папке (или, возможно, / etc / network настроена как их домашняя папка) и могут не перемещаться нигде в файловой системе. Единственный файл, к которому у них есть доступ для чтения / записи, - это файл интерфейсов.

Это возможно? Я читал много постов о настройке пользователей SSH и т. Д., Но не видел ничего об ограничении одного пользователя только его домашней папкой, и все...?

3 ответа

Если вы хотите, чтобы пользователь только мог видеть, иметь доступ и изменять один файл, vi на самом деле не вариант. Причина в том, что любой, кто использует vi, может сразу же зайти в оболочку внутри vi и запустить любые команды, которые ему нужны, особенно если они находятся в vi как root, что, безусловно, будет иметь место, если они редактируют /etc/network/interfaces, Фактически, позволить им войти в систему и получить оболочку любого вида сразу же не достигнет вашей цели.

Вот решение из двух частей, которое я предлагаю вам попробовать:

Резюме:

  1. Разрешить пользователю sftp только определенный файл только в определенное место, не имея возможности получить любой другой вид оболочки.
  2. Создать и выполнить задание, которое автоматически проверяет изменения и условно копирует "новый" файл интерфейсов на место и перезапускает сеть.

Руководство:

  1. Настройте пользователя, который может использовать протокол 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
      


  2. Теперь, когда мы создали пользователя, единственной возможностью которого является размещение файла с именем "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, которая позволит определенному непривилегированному пользователю выполнить определенную команду с конкретными аргументами с повышенными привилегиями.

Из образца suoders

# 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
Другие вопросы по тегам