Это решение с использованием скриптов 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
.