Подобно античному небожителю, root в Linux/Unix регулярно принимает облик простых смертных
пользователей.
В этом ему помогают магический посох и волшебный кристалл утилиты su и sudo.
Однако при спуске с Олимпа запуске sudo суперпользователь может сталкиваться не только с
проблемами, присущими пользователям без приставки «супер», но и с такими, которые рядовым
пользователям незнакомы.
Например:
Необходимо сгенерировать связку PGP-ключей для рядового пользователя vasya.
Пробуем:
sudo -u vasya -H gpg --gen-key
GnuPG просит заполнить описание ключа, затем делает паузу и завершается с ошибкой (пример взят из CentOS 6):
You need a Passphrase to protect your secret key.
can't connect to `/home/vasya/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[27060]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.
В CentOS 7 ответ станет ещё лаконичнее — из него исчезнет единственная подсказка к ответу:
Для защиты секретного ключа необходима фраза-пароль.
gpg: прервано пользователем
Причина:
GnuPG пытается защитить создаваемый закрытый ключ паролем.
Для чтения пароля утилита gpg вызывает сценарий pinentry, который в зависимости от дистибутива и окружения вызывает одну из следующих утилит:
- pinentry-tty (в CentOS 6)
- pinentry-curses (в CentOS 7)
- pinentry-gnome3
- pinentry-gtk-2
- pinentry-x11
В текстовой консоли работают только первые две.
Однако обе они проверяют владельца консоли, и если владелец не совпадает с текущим пользователем, считают консоль небезопасной и завершаются без объяснений.
При смене текущего пользователя через su или sudo владельцем консоли будет оставаться пользователь, под которым администратор зашёл в систему, т.е. либо root, либо условный petya, имеющий право повышать свои привилегии до root и vasya.
Проверяем владельца консоли:
ls -l `tty`
Исправляем его:
chown vasya `tty`
После этого "sudo -u vasya gpg ..." вызовет pinentry без ошибок.
← Назад в Блог