Если sudo vi /etc/hosts
выполнено успешно, это означает, что системный администратор разрешил пользователю запускать vi /etc/hosts
от имени root.В этом весь смысл sudo :, который позволяет системному администратору разрешать определенным пользователям выполнять определенные команды с дополнительными привилегиями.
Предоставление пользователю разрешения на запуск vi
дает ему право запускать любую команду vi, включая :sh
для запуска оболочки и :w
для перезаписи любого файла в системе. Правило, позволяющее запускать только vi /etc/hosts
, не имеет смысла, поскольку позволяет пользователю запускать произвольные команды.
Никакого «взлома» здесь нет. Нарушение безопасности происходит из-за неправильной конфигурации, а не из-за дыры в модели безопасности. Sudo особо не пытается предотвратить неправильную настройку. Хорошо известно -, что его документация сложна для понимания; если сомневаетесь, поспрашивайте и не пытайтесь делать слишком сложные вещи.
Как правило, сложно дать пользователю определенную привилегию, не дав ему больше, чем предполагалось. Бульдозерный подход, такой как предоставление им права запускать интерактивную программу, такую как vi, обречен на провал. Общий совет — предоставить минимальные привилегии, необходимые для выполнения задачи. Если вы хотите разрешить пользователю изменять один файл, не давайте ему разрешение на запуск редактора. Вместо этого либо:
Дайте им разрешение на запись в файл. Это самый простой метод с наименьшим риском сделать что-то, чего вы не планировали.
setfacl u:bob:rw /etc/hosts
Дайте им разрешение на редактирование файла через sudo. Для этого не давайте им разрешение на запуск редактора. Как объясняется в документации sudo, дайте им разрешение на запуск sudoedit
, который вызывает редактор от имени исходного пользователя , а затем использует дополнительные привилегии только для изменения файла.
bob ALL = sudoedit /etc/hosts
Метод sudo более сложен в настройке и менее прозрачен для пользователя, поскольку ему приходится вызывать sudoedit
вместо того, чтобы просто открывать файл в своем редакторе, но его преимущество заключается в том, что все обращения регистрируются.
Обратите внимание, что разрешение пользователю редактировать /etc/hosts
может повлиять на вашу инфраструктуру безопасности :Если есть какое-либо место, где вы полагаетесь на имя хоста, соответствующее конкретной машине, тогда этот пользователь сможет указать это на другую машину. Учтите, что в этом, вероятно, нет необходимости .
Это легко сделать с помощью sed:
sed 's/,//3' file
Если вы хотите напрямую применить изменения во входном файле, запустите:
sed -i 's/,//3' file
С помощью awk:
awk -F, '{print $1,$2,$3$4}' OFS=',' file
Выход:
random,test123,MyCompany Inc.
hello,12345,TestCompany LLC