저는 Linux를 처음 사용합니다(중요한 경우 Ubuntu). 우리 회사의 컴퓨터에는 여러 명의 sudo 사용자가 있습니다. 상황은 이렇습니다.
다들 업무 중에 Python 패키지를 설치해야 한다고 주장하기 때문에 sudo 사용자 권한을 원합니다(그들은 AI 엔지니어입니다).
각 사용자는 홈 폴더에 개인 rsa 키를 보관하여 github로 빠르게 풀/푸시합니다.
따라서 이론적으로 sudo 사용자가 악의적으로 행동하면 모든 사람의 개인 키를 가져와 이를 적용하고 권한이 없는 소스 코드를 가져올 수 있습니다. 그런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
감사해요
답변1
귀하가 질문에 대해 직접적으로 답변을 드리는 것은 아닙니다.XY 문제. 이것이 당신의 기본입니다.실제문제:
모두가 작업 중에 Python 패키지를 설치해야 한다고 주장하기 때문에 sudo 사용자 권한을 원합니다.
문제는 이것이다:sudo
누구도 Python 패키지를 설치하는 데 사용할 필요가 없습니다 .사실, 그것은 매우 권장되지 않습니다. 특히 동일한 시스템을 여러 사람이 사용하는 경우 다른 사람이 필요할 수 있는 시스템 수준 패키지를 누군가가 망치는 것을 막을 수 없습니다. 버전 충돌, 일부 패키지의 주요 변경 사항 등이 있으면 어떻게 되나요?
해결 방법 1 - 사용자 수준 설치
실제 해결책은 Python 패키지의 사용자 수준 설치를 사용하는 것입니다. 즉, 대신 다음을 sudo pip install …
수행합니다.
pip install --user pandas
그러면 해당 사용자의 홈 디렉터리에 패키지가 설치되고 시스템 패키지 라이브러리는 그대로 유지됩니다.
이 점은 아무리 강조해도 지나치지 않습니다. sudo
with 를 사용해도 좋은 점은 없습니다 pip
.
해결 방법 2 - Pipenv 또는 Poetry
더 나은 솔루션에는 다음이 포함됩니다.사용하여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 배포판의 사용자 수준 설치를 생성합니다. 이런 방식으로 사용자는 Pipenv 프로젝트가 초기화된 Python 버전을 사용할 수 있습니다. 예를 들어 3.8로 업그레이드할 때까지 잠시 동안 3.7을 유지할 수 있습니다.
필요한 경우 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 인증은 사용자의 개인 키를 다른 사람에게 공개할 필요 없이 수행됩니다. 로컬 컴퓨터가 아닌 다른 호스트.
(로컬 시스템이 linux/unix 변형이 아닌 Windows를 실행하는 경우 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.*
비밀번호 없이 Archemar로.
참고하세요
sudo -u www-data rm -rf /var/www/log/upload.*
rm
와 다르기 때문에 작동하지 않습니다(비밀번호를 묻습니다)/bin/rm
.
/etc/sudoers
반드시 명령을 사용하여 편집하세요visudo
.
sudo
고급 수준 에 도달하면/etc/sudoers.d
.