ブラウザ(PHP)からFTPユーザ作成できるようにする
1, FTPユーザの作り方は、Linuxユーザを作る。通常のSSH接続は出来ないように、シェルをsbin/nologin指定。
2, 問題は、useraddやpasswdなどはroot権限が必要で、apacheユーザでは実行出来ない。
3, 単純にapacheユーザにroot権限を与えると、ftpユーザがアップロードしたphpファイルでもlinuxシェルコマンドでも、root権限で実行できてしまう!
4, sudoする時にrootパスワード入力するようにしても、rootパスワードをファイルに書き込んでおくのはセキュリティ上問題有りだしな…。
5, 理想的なのは、フルパス付きで特定のファイルだけ、apacheがroot権限を実行できる事だよな~。
6, 次善の作としては、管理画面WebサーバとFTPアップロード出来るサーバの2台を用意するって事だけど、それも大変。
ここでは、セキュリティ的な問題は無視して、apacheにroot権限を与える。
visudoで、sudoersファイルの最後に追記
1 2 3 4 5 6 7 8 9 10 11 12 |
# apacheユーザは、useradd,passwd,chmodはroot(パスワード無し)で実行できる。それ以外は実行出来ない。 apache ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/bin/passwd, /bin/chmod # apacheユーザに、完全なroot権限を与えるならALL # apache ALL=(root) NOPASSWD: ALL #システム再起動 reboot # visudoが反映されたか確認 sudo -l -U apache ユーザー apache は localhost 上で コマンドを実行できます (root) NOPASSWD: /usr/sbin/useradd, /usr/bin/passwd, /bin/chmod |
index.phpだけで、それっぽいのが出来た。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<form method="post"> 新規FTPユーザ:<input type="text" name="ftp_user"> <input type="submit" value="新規プロジェクト追加"> </form> <?php define("HOME_DIR", "/var/www/html/ftp"); // FTPユーザ名でFTPユーザを作成 if(!empty($_POST['ftp_user'])){ make_ftpuser($_POST['ftp_user']); } // FTPユーザー作成 function make_ftpuser($ftp_user){ $home_dir = HOME_DIR; $user_name = $ftp_user; // FTPユーザ作成 $command = "/usr/bin/sudo /usr/sbin/useradd -d $home_dir/$ftp_user -s /sbin/nologin $user_name "; if(!linux_exec($command)){ echo "FTPユーザ名「". $ftp_user ."」は作成できませんでした"; return false; } // FTPユーザのパスワードをFTPユーザ名でセット $command = "echo $ftp_user | /usr/bin/sudo passwd --stdin $ftp_user"; if(!linux_exec($command)){ echo "ユーザ「". $ftp_user ."」のパスワード変更に失敗!"; return false; } // FTPユーザのホームディレクトリのパーミッションを変更 $command = "/usr/bin/sudo chmod -R 755 $home_dir/$ftp_user"; if(!linux_exec($command)){ echo "ユーザ「". $ftp_user ."」のホームディレクトリのパーミッションを変更に失敗!"; return false; } // 問題なくFTPユーザ作成が完了 echo "FTPユーザ「". $ftp_user ."」を生成". "<br><br>"; return true; } // linuxシェルコマンド実行の関数 function linux_exec($command){ $output = []; $return_var = 0; exec($command, $output, $return_var ); // 正常終了なら、パスワードもFTPユーザ名でセットする if($return_var == 0){ return true; }else{ echo $command . "エラーコード:". $return_var. " 戻り値:".print_r($output,true) ."<br>"; return false; } } // ディレクトリ一覧(FTPユーザの一覧を表示) echo "<h3>FTPユーザの一覧</h3>"; $command = "ls -F | grep /"; $output = []; $return_var = 0; exec($command, $output, $return_var ); // 正常終了なら if($return_var == 0){ foreach($output as $ftp_user){ $link_name = rtrim($ftp_user , '/'); echo "<div><a href=edit.php?ftp_user=$link_name>$link_name</a></div>"; } }else if($return_var == 1){ echo "まだ、FTPユーザはありません。"; }else{ echo "FTPユーザ一覧の取得失敗"; echo "エラーコード:". $return_var. " 戻り値:".print_r($output,true). "<br><br>"; } |