Я новичок в Linux (Ubuntu, если это имеет значение). В моей компании есть несколько пользователей sudo на машине. Ситуация такая:
Все хотят иметь привилегии пользователя sudo, потому что они утверждают, что им нужно устанавливать пакеты Python во время работы (они инженеры ИИ)
Каждый пользователь хранит закрытые ключи RSA в своей домашней папке для быстрого извлечения/отправки на GitHub.
Так что теоретически, если пользователь sudo станет мошенником, он может просто схватить закрытый ключ каждого, навязать его и вытащить исходный код, на который он не имеет права. Как мне предотвратить это?
Спасибо
решение1
Я не даю вам прямого ответа на ваш вопрос, поскольку вы описываетепроблема XY. Это ваш базовый,действительныйпроблема:
Все хотят иметь привилегии пользователя sudo, потому что они утверждают, что им нужно устанавливать пакеты Python во время работы.
Проблема вот в чем:никому не нужно использовать sudo
для установки пакетов Python.На самом деле, это крайне не рекомендуется. Особенно если у вас несколько человек, использующих одну и ту же систему, вы не можете помешать кому-либо вмешиваться в системные пакеты, которые могут потребоваться другим. Что делать, если есть конфликты версий, критические изменения в некоторых пакетах и т. д.?
Решение 1 — Установки на уровне пользователя
Реальное решение — использовать установки пакетов Python на уровне пользователя. То есть, вместо sudo pip install …
, выполните:
pip install --user pandas
Это установит пакет в домашний каталог соответствующего пользователя и оставит библиотеку системных пакетов в покое.
sudo
Я не могу не подчеркнуть этого: ничего хорошего из использования with не получается pip
.
Решение 2 — Pipenv или поэзия
Еще лучшее решение включает в себяс использованиемpipenv
илиpoetry
, которые создают виртуальную среду для размещения пакетов.
Пакеты и версии могут даже отличаться для разных проектов — это особенно важно, если вам нужно, чтобы пакет оставался в определенной версии в течение некоторого времени (например, пакет pandas
печально известен изменением своего API; scipy
некоторое время назад в него были внесены критические изменения и т. д.).
Я бы порекомендовал Pipenv, но по состоянию на 2020 год его поддержка была весьма неудовлетворительной, и уже давно не было никаких релизов.
Чтобы использовать Poetry, просто установите его на уровне пользователя:
pip install --user poetry
Затем инициализируйте новую среду для текущего проекта:
cd /path/to/project
poetry install pandas
Это создаст новый файл конфигурации Poetry, который определяет требования для текущего проекта. Запустите, poetry
чтобы узнать больше или прочитать документацию.
Решение 3 —pyenv
Лучшим способом сделать это было бы заставить пользователей установить собственную версию Python. Вы можете использоватьpyenv
для создания установок на уровне пользователя целых дистрибутивов Python. Таким образом, пользователи могут использовать любую версию Python, с которой был инициализирован их проект Pipenv, например, оставаться на версии 3.7 некоторое время, пока они не захотят обновиться до 3.8.
Это особенно удобно, если вы не хотите нарушать работу всех пакетов, выполняя незначительное обновление Python на системном уровне, если это когда-либо потребуется.
Итог: Не давайте обычным пользователям доступ sudo, если вам это не нужно. Пусть они используют свое собственное пользовательское пространство для установки Python и/или пакетов Python.
Предостережение: для успешной сборки некоторых пакетов Python могут потребоваться определенные библиотеки. Вы не сможете избежать установки этих библиотек на системном уровне, но в таких редких случаях администратор может быть готов установить sudo apt install …
любую необходимую библиотеку.
решение2
Вероятно, разработчики Python подключаются к этой машине удаленно, ssh
а не входят в систему напрямую через консоль.
В таком случае их личные ключине должнабыть на общей машине вообще, именно по этой причине. Вместо этого они должны работать ssh-agent
на своих локальных машинах и подключаться к общей машине с помощью ssh -A
(или устанавливать ForwardAgent yes
для этого хоста в ~/.ssh/config
) и хранить закрытые ключи только на своих локальных машинах. Использование ssh-agent
и переадресация агента заставит удаленную (общую) машину безопасно пересылать запросы аутентификации (например, с github) обратно на ssh-agent
локальную машину пользователя, где будет выполняться аутентификация RSA без необходимости когда-либо раскрывать закрытый ключ пользователя какому-либо хосту, кроме его локальной машины.
(Если локальная машина работает под управлением Windows, а не варианта Linux/Unix, то клиент Windows SSH все равно должен каким-то образом обеспечивать переадресацию агента SSH, но я не знаю, как к нему можно будет получить доступ. Подробности смотрите в документации.)
решение3
Решением было бы дать разработчикам python разрешение использовать sudo только те команды, которые им действительно нужны. Разрешенные команды полностью указаны, включая аргументы, и возможны подстановочные знаки.
Ниже приведен ответ из сообщения Unix Stackexchange.
Как удаленно выполнить команду ssh или команду sudo без пароля.
Вы можете указать sudo пропустить пароль для некоторых команд.
например в
/etc/sudoers
archemar ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*
это позволяет мне использовать
sudo -u www-data /bin/rm -rf /var/www/log/upload.*
как архемар без пароля.
Обратите внимание, что
sudo -u www-data rm -rf /var/www/log/upload.*
не будет работать (попросит пароль), так как
rm
отличается от/bin/rm
.Обязательно редактируйте
/etc/sudoers
с помощьюvisudo
команды.Достигнув продвинутого уровня, вы, возможно, захотите иметь собственные
sudo
файлы в формате/etc/sudoers.d
.