tl; dr-/etc/passwdでApacheにシェルを与えることの危険性は何ですか?
私はDOSの試みと戦うためにApacheでmod_evasiveをセットアップすることに取り組んでいます。 DOSSystemCommand
を使用して、問題のあるIPアドレスをiptablesのBANNEDチェーンに追加するスクリプトを実行します。
このプロセスを機能させる唯一の方法は、Apacheのシェルを/sbin/nologin
から/bin/bash
に変更することであることがわかりました。しかし、シェルを変更しないことで失敗するのは、実際にはスクリプトの一部にすぎません。 DOSSystemCommand
行とそれが実行するスクリプトは次のとおりです。
DOSSystemCommand "/usr/bin/Sudo /bin/bash /var/www/html/ban_ip.sh %s"
とスクリプト...(私はテスト中です..だから私は冗長な出力と短い禁止期間を持っています)
#!/bin/bash
IP=$1
IPTABLES=/sbin/iptables
Sudo $IPTABLES -I BANNED -p tcp -s $IP --dport 443 -j DROP
Sudo $IPTABLES -I BANNED -p tcp -s $IP --dport 80 -j DROP
echo Sudo $IPTABLES -v -D BANNED -p tcp -s $IP --dport 80 -j DROP | at -m now + 1 minutes
echo Sudo $IPTABLES -v -D BANNED -p tcp -s $IP --dport 443 -j DROP | at -m now + 2 minutes
echo rm -fv /tmp/dos-$IP | at -m now + 2 minutes
したがって、Apacheに/sbin/nologin
のシェルがある場合、IPTABLESルールが追加され、at
ジョブが作成されますが、atジョブの結果が記載されたメールを受け取ると次のように表示されます。 User is currently unavailable
なので、iptablesルールが削除されることはありません。 Apache/bin/bashをシェルとして指定すると、iptablesルールが追加され、atジョブが作成され、iptablesの削除が指定された時間に期待どおりに機能します。
だから私の質問は:Apacheユーザーにシェルを与えることによってサーバーをどのように危険にさらしているのですか?
関連するコードは、mod_evasive.cの224行目にあります。
if (sys_command != NULL) {
snprintf(filename, sizeof(filename), sys_command, text_add);
system(filename);
}
それでは、man 3 system
を確認しましょう:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c command,
and returns after the command has been completed. During execution of the
command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
これで、指定されたコマンドがシェル内で実行されていることがわかります。確かに、system(3)
のドキュメントはこの点で混乱していますが、確かにsee何が起こっているのかを確認し、適切な推論を行うことができます。これは、単に/bin/sh
ではなく、ユーザーのデフォルトのシェルで実行されています。 。
正しい解決策は比較的簡単です。system(3)
呼び出しをfork(2)
とexecve(2)
(または実質的に同様のもの)に置き換えるだけです。それを望まない場合は、非常に小さく制限のあるシェルを作成して、物事を適切にロックすることもできます。
偶然にも、この質問がきっかけで再確認しました。htaccessファイルを作成できるユーザーは、mod_evasiveがインストールされているだけではボックスを引き継ぐことができないことを知っていただければ幸いです(RSRC_CONF
が正しい)設定なので、その点でmod_evasiveの作成者に称賛を送ります)。ただし、構成の説明方法を考えると、少なくとも、コードをApacheとして実行できるユーザー(たとえば、mod_su*
などを除く、PHP、Perl、CGIなどを実行できるユーザー)がいる可能性が非常に高くなります。 。)、IPTablesを使用して自分のサーバーからあなたを禁止することができます。
Apacheがこのスクリプトを実行する必要があるのはなぜですか? Apacheをrootに昇格させ、スクリプトをrootとして実行できるときにシェルを割り当てているようです。
Apache Sudoにアクセスを許可することは、建物のすべてのドアと窓をロックすることによく似ていますが、出荷ドック用のオーバーヘッドドアを取り付けて、大きく開いたままにしておきます。 (理論的には、ユーザーは出荷ベイ内の特定のものにしかアクセスできません...しかし、それでも建物への入場は可能であり、さらなる入場ポイントを探し始めることができます。
ApacheユーザーにSudoアクセスに対応するシェルを提供することは、キーカッターを出荷ベイに残すことによく似ています。運が良ければ、攻撃者は必要なキーを作成(アクセス/特権を取得)できます。
https://unix.stackexchange.com/questions/78985/deleting-users-with-nologin-Shell 上記の質問によると:/ bin/nologinシェルは、誰もがユーザーとしてログインできないようにします問題の(console、ssh、suなどを参照)。
また、以下もご覧ください: https://security.stackexchange.com/questions/5707/recommendations-for-changing-the-default-Shell-for-service-accounts -ディスカッションnologinとシェルとしての/ dev/nullのセキュリティの比較。