Итак, у меня есть файл data.txt котором хранится имя пользователя и некоторые данные, по одной строке на пользователя. Я хотел бы иметь скрипт Bash, который может быть запущен пользователями и позволяет им вызывать

grep -w "^$USER" data.txt

чтобы получить их часть информации, но не в состоянии прочитать весь data.txt . Есть ли какой-нибудь простой трюк с этим?

Не должен быть Bash, любой C или Perl-решение подойдет.

1 ответ1

0

Это решение с использованием скриптов Bash.

Я предполагаю, что вы не можете использовать setuid для скриптов, как объяснено в этом ответе U & L. Совет в том, чтобы использовать

оболочка, которая дезинфицирует среду (например, sudo с опцией env_reset ).


В этом примере я использую /etc/our_secrets.txt вместо data.txt . Сначала ограничьте доступ к файлу:

sudo chown root: /etc/our_secrets.txt
sudo chmod 600 /etc/our_secrets.txt

Затем создайте скрипт /usr/local/sbin/sget_my_secret . Это скрипт:

#!/bin/sh
exec /bin/grep -w "^$SUDO_USER" /etc/our_secrets.txt

И его разрешения:

sudo chown root: /usr/local/sbin/sget_my_secret
sudo chmod 744 /usr/local/sbin/sget_my_secret

Теперь вы должны запустить sudo visudo и изменить файл sudoers чтобы пользователи могли вызывать sudo /usr/local/sbin/sget_my_secret . Самый простой способ - это добавить

ALL ALL=(ALL) NOPASSWD: /usr/local/sbin/sget_my_secret

в файл. Теперь любой пользователь может запустить sudo sget_my_secret . Для удобства вам нужен другой скрипт, /usr/local/bin/get_my_secret:

#!/bin/sh
exec /usr/bin/sudo /usr/local/sbin/sget_my_secret

Его разрешения:

sudo chown root: /usr/local/bin/get_my_secret
sudo chmod 755 /usr/local/bin/get_my_secret

В этот момент любой пользователь может запустить get_my_secret чтобы получить свою информацию (если есть). Вот что происходит:

  1. get_my_secret работает с обычными разрешениями.
  2. Он пытается запустить sudo /usr/local/sbin/sget_my_secret .
  3. Файл sudoers говорит, что может это сделать.
  4. sget_my_secret запускается с повышенными разрешениями.
  5. Повышенный grep обрабатывает файл.

Примечания по безопасности:

  • В моем Debian упомянутая опция env_reset включена по умолчанию.
  • Вы можете заменить эту строку ALL ALL=(ALL) ... на более строгую.
  • В сценариях я использую полные пути везде, где могу.
  • Любой, кто сможет запустить sget_my_secret со спуфингом $SUDO_USER , сможет получить чужой секрет. Я думаю, что если вы можете сделать это, вы также можете прочитать our_secrets.txt напрямую.
  • Вы можете подумать, что можете позволить пользователям запускать sudo grep ; но это позволило бы им grep что-нибудь в любом файле! sget_my_secret том, чтобы добавить только один специализированный исполняемый файл в файл sudoers .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .