Это решение с использованием скриптов 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 чтобы получить свою информацию (если есть). Вот что происходит:
get_my_secret работает с обычными разрешениями.
- Он пытается запустить
sudo /usr/local/sbin/sget_my_secret .
- Файл
sudoers говорит, что может это сделать.
sget_my_secret запускается с повышенными разрешениями.
- Повышенный
grep обрабатывает файл.
Примечания по безопасности:
- В моем Debian упомянутая опция
env_reset включена по умолчанию.
- Вы можете заменить эту строку
ALL ALL=(ALL) ... на более строгую.
- В сценариях я использую полные пути везде, где могу.
- Любой, кто сможет запустить
sget_my_secret со спуфингом $SUDO_USER , сможет получить чужой секрет. Я думаю, что если вы можете сделать это, вы также можете прочитать our_secrets.txt напрямую.
- Вы можете подумать, что можете позволить пользователям запускать
sudo grep ; но это позволило бы им grep что-нибудь в любом файле! sget_my_secret том, чтобы добавить только один специализированный исполняемый файл в файл sudoers .