sudoサポートスクリプトを保護する方法

sudoサポートスクリプトを保護する方法

権限のないユーザーでrootコマンドを実行するソリューション -sudoスクリプト- セキュリティの脆弱性が非常に高く、予期しない動作や結果が発生する可能性が高いです(他のソリューション(バイナリラッパーなど)でも同様ですsetuid)。

明らかに、スクリプトは以下のようにvisudoを使用して追加されました。

www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand
  • しなければならない読める書き込み可能そしてルートとしてのみ実行可能- 所有者とグループの両方(chown root:root mycommand; chmod 700 mycommand
  • それを持たなければならない親ディレクトリの所有権 root:root755パターン付き
  • 入力を確認する必要があります。- パラメータと標準入力 - 実行拒否と中断無効または予期しない提供されたデータ
  • 相対パス/エイリアス(?)の代わりに絶対パスを使用する必要があります。
  • Defaults env_reset設定する必要があります/etc/sudoers(?ここで助けが必要です)

sudoサポートスクリプトを保護するために何ができますか?

答え1

sudoers最良の方法の1つは、ファイルの "Digest_Spec"の可能性を使用して実行可能ファイルのチェックサムをチェックすることです。

マニュアルページから抜粋:

コマンド名の前にDigest_Specが付いている場合、指定されたSHA-2ダイジェストを使用して解決できる場合にのみ、コマンドは正常に一致します。

openssl を使用してチェックサムを生成します。

$ openssl dgst -sha224 /usr/local/sbin/mycommand
 SHA224(/usr/local/sbin/mycommand)=
         52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365 

次に、sudoersファイル(同じ行に):

 www-data ALL=(ALL) NOPASSWD: 
    sha224:52246fd78f692554c9f6be9c8ea001c9131c3426c27c88dbbad08365
    /usr/local/sbin/mycommand

答え2

スクリプト保護基準のリストを少し変更します。次のような項目または類似の項目を考慮すると、次のようになります/etc/sudoers

www-data ALL=(ALL) NOPASSWD: /usr/local/sbin/mycommand

スクリプトを宣言できます。

  • rootユーザーのみが書き込み可能でなければなりません。
  • rootユーザーが読み取りおよび実行できる必要があります。
  • ルートのみを書き込むことができるディレクトリ階層にする必要があります。
  • 入力内容は使用のために「十分に」検証されなければならず、他の内容は拒否されます。
  • そのアクションを実行するために必要な最小限の権限セットが必要です(必ずしもsetuidルートである必要はありません)。
  • PATH外部コマンドを使用する前に定義する必要があります。
  • すべての変数を使用する前に既知の値に設定する必要があります。
  • 呼び出しのタイミングと方法だけでなく、結果の操作も示す監査証跡を生成する必要があります(考えてみてくださいlogger)。

また、ほとんどの場合、スクリプトは実際に root として実行する必要はありません。他のアカウントに対してsetgidまたはsetuidを実行できます。通常、スクリプトへのフルルートアクセスを許可しない場合は、次のオプションを検討してください。

SELinux環境では、スクリプトが予期しない操作を実行するのを防ぐポリシーを作成できます。包括的なroot権限よりも詳細なCAP_NET_ADMINなどの機能も検討する価値があります。

iptables単一のIPv4アドレスを検証し、それをに渡す特定のケースでは、可能非特定オクテットシリーズでIPアドレスを確認する機能。この場合、444.555.666.999はiptables実際のIPアドレスではなくすべてを拒否するので、合理的なものと見なすことができます。極端な場合は、REを一致させるだけ/^[0-9.]+$/で値をに渡すのに十分であると考えることもできますiptables。一方、多く回答StackExchangeと他の場所IPアドレス解決の問題を解決します。一部は他よりも優れています。

考慮すべき特別なケースは、RFC1918アドレス、マルチキャストアドレス、および独自の外部IPアドレス範囲です。ああ、そして以前にクラスEとして知られている予約されたブロックがあります。 IPv6サポートが必要ですか?

スクリプトが毎分数百回呼び出されるとどうなりますか?これらの可能性に備えなければなりませんか?チェーンiptablesがあふれますか?チェーンに何百ものルールが必要だと思われる場合ipset拡大するiptables線形リストではないこれとても良いチュートリアル。保護の面では、何千ものコレクションを構築できます。数千) ルールセットを通過するトラフィックフローを大幅に遅くすることなく、同様のルールを実行できます。

簡単に見える要求は突然かなり複雑になります。

答え3

名前付きパイプ方法。ルートとして実行

mkfifo -m 666 /tmp/foo
/tmp/readpipe.sh &

その後、ユーザーwww-dataとしてパイプに書き込むことができます。

echo test >>/tmp/foo

最も単純な形式のreadpipe.sh(taintを持つPerlがより良い):

#!/bin/sh
while read A </tmp/foo
do
 echo received $A     
done

答え4

sudoサポートスクリプトを保護するために実行できるその他の操作:PAM - プラグイン認証モジュールを使用します。

PAM管理者ガイド:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_SAG.html

PAMモジュール作成者ガイド:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_MWG.html

PAMアプリケーション開発者ガイド:http://www.linux-pam.org/Linux-PAM-html/Linux-PAM_ADG.html

また、/usr/share/doc/packages/pam/pdf システムのPAMバージョンに関連する文書があることを確認してください。

PAMはLinuxの基本的なセキュリティメカニズムの1つです。これは多くを保護してロックするために使用されます。2つの例はログインプロセスとパスワード変更プロセスです。これは、最小文字長や有効期限などのパスワード制限を適用するときにPAMを介して行われます。 PAMがコアシステムプロセスに十分であれば、スクリプトにも十分です。まず、PAMシステム管理ガイドを確認して、次の利点をすでに享受できるかどうかを確認してください。

  • pam_time:ユーザーを認証しませんが、代わりにシステムおよび/または特定のアプリケーションへのアクセスを1日の異なる時間、特定の曜日、または他の端末回線で制限します。名前、時間、曜日、要求されたサービス、要求された端末に基づいて(個々の)ユーザーのアクセスを拒否するようにモジュールを構成できます。

  • pam_env:呼び出し時に環境変数を設定または設定解除します。 pamモジュールを作成するときにそれを利用してください。

  • pam_localuser:通常、ネットワークユーザーのサブセットと特定のワークステーションにローカルなアカウントを含むサイト全体のログインポリシーを強制するのに役立ちます。 pam_wheelまたはpam_listfileでpam_localuserを使用することは、ローカルユーザーおよび/またはネットワークユーザーのサブセットにアクセスを制限する効果的な方法です。

  • リストは続きます。システム管理者ガイドを参照し、必要に応じて使用してください。

次の内容も役に立ちます。http://freecode.com/projects/pam_script/

ここでは、モジュール作成者ガイドとアプリケーション開発ガイドを読むことができます。それがPAMの目的です...プラグタイプ認証モジュール効果的にコードを書いており、まだコーディングをしていない場合、作業が終わればプログラマになります。これは、Microsoft Windowsのように、一部のチェックボックスをクリックして有効/無効にする「IT」エントリではありません。 PAMを使用する理由は、システム管理者がセキュリティ上の理由からすべてのタスクを実行するためにモジュールを接続することができるためです。たとえば、ユーザーがpasswd自分のパスワードを変更しようとすると、セキュリティの目的でPAMを使用してパスワードを変更するため、パスワードを変更するために「sudo passwd」を入力する必要はありません。スクリプトで実行する必要がある操作に応じて、PAMを正しく使用し、スクリプトの所有権とSUID / GUIDを次のように設定すると、sudoが不要になることがあります/usr/bin/passwd

これを確実にするために、私が何をすることができるのか[自分に]尋ねると...これが何かをする最善の方法ではないという兆候かもしれません。この場合、sudoを使用して実行中のスクリプト/実行ファイルに高い権限を付与してください。代わりに、Linuxのすでに確立されたメカニズムがこのようなことをどのように処理するかを見てください。たとえば、ユーザーが/usr/bin/passwd root所有のファイルを編集および/etc/passwd変更するには、root権限が必要な場合です。/etc/shadowPAMを使用すると、ユーザーID、グループID、ローカルユーザーアカウントなどに基づいて、特定の時間内にスクリプトを実行できる人を制限できます。さらに一歩進んで、そのユーザーだけでスクリプトを実行するために独自のパスワードを使用して別々のグループアカウントを作成することができます。ルートとしてログインできるユーザーのみがホイールグループスキームに従います。お役に立てば幸いです。

関連情報