私は 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
ん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
。