9

私は現在、PHPを使用してシステムに変更を加えるプロジェクトに取り組んでいます(たとえば、Nginxの構成ファイルの変更/サービスの再起動)。

PHPスクリプトはローカルホストで実行されています。私の意見では、最良の(読む:最も安全な)方法は、SSHを使用して接続を確立することです。次のいずれかのオプションを検討しています。

オプション1:ユーザー名/パスワードをphpセッションに保存し、sudoのプロンプトを表示します

ユーザー名/パスワードを指定してphpseclibを使用し、これらの値をphpセッションに保存して、コマンドごとにsudoの入力を求めます。

オプション2:ルートログインを使用する

ログインスクリプトでrootユーザー名とパスワードを指定してphpseclibを使用する。この場合、ユーザーにsudoを要求する必要はありません。(実際には安全な解決策ではありません)

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('root', 'root-password')) {
    exit('Login Failed');
}
?>

オプション3:ファイルから読み取った公開鍵を使用して認証する

PHP SSHlibを公開鍵とともに使用して、公開鍵を認証し、wwwルートの外に配置します。

<?php

    $connection = ssh2_connect('shell.example.com', 22, array('hostkey' => 'ssh-rsa'));
    if (ssh2_auth_pubkey_file($connection, 'username', '/home/username/.ssh/id_rsa.pub', '/home/username/.ssh/id_rsa', 'secret')) {
        echo "Public Key Authentication Successful\n";
    } else {
        die('Public Key Authentication Failed');
    }
?>

オプション4:?

4

6 に答える 6

11

これを3つの簡単なステップで行うことをお勧めします。

初め。 別のユーザー(たとえばrunner)を作成し、このユーザーだけが機密データ(ユーザー/パス、秘密鍵など)にアクセスできるようにします。つまり、phpコードがこれらのデータにアクセスすることを拒否します。

2番。 その後、単純なブロッキングFIFOパイプを作成し、PHPユーザーに書き込みアクセスを許可します。

最後。 そして最後に、fifoから行を読み取り、たとえばsshコマンドで実行する簡単なデーモンを作成します。このデーモンをrunnerユーザーで実行します。

コマンドを実行するには、ファイル(fifoパイプ)にコマンドを書き込む必要があります。必要に応じて、出力を別のパイプまたはいくつかの単純なファイルにリダイレクトできます。

fifoに次の簡単なコマンドを使用させるには:

mkfifo "FIFONAME"

ランナーデーモンは、次のような単純なbashスクリプトになります。

#!/bin/bash
while [ 1 ]
do
    cmd=$(cat FIFONAME | ( read cmd ; echo $cmd ) )
    # Validate the command
    ssh 192.168.0.1 "$cmd"
done

この後、コードを信頼できます。phpコードが完全にハッキングされた場合、アップストリームサーバーはまだ安全です。このような場合、攻撃者は機密データにまったくアクセスできませんでした。彼はrunnerデーモンにコマンドを送信できますが、コマンドを適切に検証すれば、心配する必要はありません。

:-)

于 2012-11-27T15:05:42.913 に答える
1

方法1

私はおそらくsuidフラグを使用します。Cで小さなsuidラッパーを作成し、実行するすべてのコマンドが事前定義されており、phpスクリプトで制御できないことを確認します。したがって、ラッパーを作成し、ARGVからコマンドを取得します。したがって、呼び出しは次のようになります。

./wrapper reloadnginx

その後、ラッパーはを実行し/etc/init.d/nginx reloadます。

chownルートとにラッパーすることを確認してくださいchmod +s。次に、コマンドをrootとして生成しますが、すべてのコマンドを事前定義しているため、phpスクリプトはrootとして他に何も実行できません。

方法2

sudoを使用して、特定のコマンドのパスワードなしで実行できるように設定します。そうすれば、同じ効果が得られ、特定のアプリケーションのみがルートとして生成されます。ただし、引数を制御することはできないため、これらのバイナリに特権の昇格がないことを確認してください。

PHPスクリプトに完全なrootアクセス権を与えたくはありません。

于 2012-11-28T09:45:44.030 に答える
0

同じホストで実行している場合は、構成ファイルを直接記述してサービスを(再)開始するか、ラッパースクリプトを作成することをお勧めします。

最初のオプションには明らかに非常に高い特権レベルが必要ですが、これはお勧めしません。ただし、実装が最も簡単です。sshを使用した他の名前付きオプションは、攻撃者がルート権限を簡単に取得する可能性があるため、あまり役に立ちません。

2番目のオプションははるかに安全で、高レベルのアクセス権を持つプログラムを作成する必要があります。このプログラムは、ディレクトリなどから指定された入力ファイルのみを取得します。php-scriptはユーザーのフロントエンドにすぎず、上記の入力ファイルを書き込むため、必要な権限は非常に低くなります。そうすることで、高特権と低特権を分離できるため、攻撃者がテキストファイルを介して間接的にしか機能しない可能性のあるプログラムを保護するのがはるかに簡単になるため、リスクが軽減されます。このオプションはより多くの作業を必要としますが、はるかに安全です。

于 2012-11-20T11:24:43.577 に答える
0

オプション3を拡張して、ライブラリなしでSSHキーを使用できます

$command = sprintf('ssh -i%s -o "StrictHostKeyChecking no" %s@%s "%s"',
                $path, $this->getUsername(), $this->getAddress(), $cmd );
return shell_exec( $command );

私は自分のプロジェクトでそれをかなりよく使用します。私が作成したSSHアダプターを調べることができます。

上記の問題は、(サーバーに接続している間は)リアルタイムの決定を下せないことです。リアルタイムが必要な場合は、SSH2と呼ばれるPHP拡張機能を試してください。

ps。仰るとおりです。SSHシームが最も安全なオプションです。

于 2012-11-26T15:05:08.660 に答える
0

setcapルートとして実行しなくても、Nginxがポート80/443にバインドできるようにするために使用できます。Nginxは、ポート80/443(1024未満のもの)にバインドするためにrootとして実行する必要があるだけです。この回答setcapで詳しく説明されています。

ただし、いくつかの注意点があります。chown適切なユーザー()にログファイルを記録し、( )chown -R nginx:nginx /var/log/nginx以外の場所にpidファイルを構成する必要があります。/var/run/pid /path/to/nginx.pid

lawl0rは、setuid/sudoに適切な答えを提供します。

最後の復元として、変更された場合はcronジョブを使用して定期的に構成を再ロードできます。

どちらの方法でも、同じシステム上にある場合はSSHは必要ありません。

于 2012-11-30T18:17:42.410 に答える
-1

それは完全に間違っています。

新しいファイルを作成する構成ファイルを変更してから、それらをデフォルトの構成ファイルに含める必要はありません

*.confファイルとincludeディレクティブがあるapacheの例。デフォルトの設定ファイルを変更するのはまったく正気ではありません。それが私のやり方です。

sshなどは必要ありません。

私を信じてください、あなたがそうするなら、それはより良くそしてより安全です。

于 2012-11-27T18:09:47.940 に答える