php(apache)からsudoコマンドを実行する時に、パスワードありにして一般ユーザがアップロードしたphpではsudo実行出来ないようにする。
ブラウザ(PHP)からFTPユーザ作成できるようにするの時は、apacheでsudo実行する時にNOPASSWD設定だったが、今回は普通にパスワード必須にする。
重要!!
sudoコマンドは、root以外のユーザでも自分のパスワードを入力すれば、root権限で実行できる。
1, apacheは初期設定だとパスワード無しなので、パスワードを設定する。パスワード無しだとvisudoで設定してもsudo実行出来ない
1 |
passwd apache |
2, visudoコマンドで、sudo権限を変更してからreboot
1 2 3 4 |
# apacheユーザはuseraddとchmodはroot(パスワード無し)で実行できる #apache ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/bin/passwd, /bin/chmod # 今回はapacheパスワード必須。その代りコマンド制限なし! apache ALL=(root) ALL |
3, apacheのパスワードを書いたファイルをWebルートの外側に配置。
1 2 3 4 5 6 7 8 9 |
vi /var/www/env.php <?php // apacheのパスワード define("APACHE_PASSWORD", 'xxxxx'); # apacheでも読めるようにグループ変更 chown root:apache env.php # rootは読み書き、apacheはReadのみ、その他はアクセス不可 chmod 610 env.php |
4, shellコマンドを投げるPHPファイル
1 2 3 4 5 6 7 8 9 10 11 12 |
// FTPユーザ作成 // sudoにパイプ経由の標準入力で、パスワードを渡せばOK! $command = "echo $apache_password | /usr/bin/sudo -S /usr/sbin/useradd -d $home_dir/$ftp_user -s /sbin/nologin $user_name "; // 問題は、sudoとパスワード変更が対話式なので、同時に標準入力は無理…。 // $command = "echo $apache_password | echo $ftp_user | /usr/bin/sudo -S passwd --stdin $ftp_user"; // なのでpasswdの方は、shコマンドを使って子シェル実行したら、ワンライナーで行けた。 $command = "echo $apache_password | /usr/bin/sudo -S sh -c \"echo $ftp_user:$ftp_user | chpasswd\""; // FTPユーザのホームディレクトリのパーミッションを変更も、sudoにパイプ経由の標準入力で、パスワードを渡せばOK! $command = "echo $apache_password | /usr/bin/sudo -S chmod -R 755 $home_dir/$ftp_user"; |
これで自分の作ったFTPユーザ管理画面のPHPはsudo出来るけど、一般ユーザがアップロードしたphpでは、パスワードが分からないのでsudo実行出来ないはず!