LinuxのユーザをWebから追加する方法
たとえば部署のローカルサーバを新しく立てるときに、全員に
「ユーザを作るのでパスワードを登録しに来て下さい」と言うのも面倒だし
「仮パスワードで作るのでユーザ名を教えてください」というのも面倒。
そうはいっても「rootのパスワードを教えるから自分で登録してください」
というのもセキュリティ的にやりすぎ。
一時的にでいいので、自分でユーザ登録してもらうために、
Webページ経由でユーザを追加できるものを作ってみました。
方針
- phpのWebページを作って、useraddコマンドをWeb経由でやってもらう。
- useraddコマンドはrootしかできないので、sudoでrootとして実行できるようにする。
1. apacheのユーザにsudoの権限を付ける
httpdのユーザが「apache」の場合、visudoコマンドを使って
apacheがsudo経由でuseraddコマンドを実行できるようにします。
なお、手元のLinux(RHEL)では、useraddをしたときにユーザディレクトリの
実行権限が700になるようです。
ユーザごとにWebページを作る場合、"/~username/public_html/"に
アクセスできなくなるのでchmodも実行できるようにしておきます。
[root]# /usr/sbin/visudo
以下を追加する。
apache ALL=(root) NOPASSWD: /usr/sbin/useradd, /bin/chmod
上記を追加すると、apacheユーザに全ホストのrootとして、
useraddとchmodに限り、パスワードなしでsudoを
実行できるようになります。
2. ユーザを追加するスクリプトを書く。
コードをそのまま貼り付けます。
addusr.php
<html> <head><title>ユーザの追加</title></head> <body> <?php if(!empty($_POST['uname']) and !empty($_POST['pass'])){ $pattern='/^[\w\-]+$/'; if(preg_match($pattern, $_POST['uname'])){ if(is_dir("/home/".$_POST['uname']) or strcmp($_POST['uname'], "root")==0){ print $_POST['uname']."は既に登録済みです。"; }else{ exec("/usr/bin/sudo /usr/sbin/useradd -p '".crypt($_POST['pass']). "' ".$_POST['uname']); exec("/usr/bin/sudo /bin/chmod 755 /home/".$_POST['uname']); print $_POST['uname']."を作成しました。"; } }else{ print "ユーザ名には英数字もしくはハイフンを利用してください。"; } print "<br/><a href='addusr.php'><<-- 登録ページに戻る</a>"; }else{ print<<<HTML <h3>ユーザ追加ページ</h3> <hr/> 希望するユーザ名を記入して登録ボタンを押してください。<br/><br/> <form action="addusr.php" method="POST" onsubmit="return confirm('ユーザを追加してもよろしいですか?')"> <table><tr><td> ユーザ名:</td> <td><input type="text" name="uname" size="20" /> ※半角英数およびハイフンのみ利用可能です。</td> </tr><tr><td> パスワード: </td><td> <input type="password" name="pass" size="20" /> </td></tr></table> <br/> <input type="submit" name="submit" value="登録" /> </form> HTML; } ?> </body> </html>
if(is_dir("/home/".$_POST['uname']) or strcmp($_POST['uname'], "root")==0)
既存ユーザのチェック方法ですが、rootか、/home/内にディレクトリがない場合は
OKにしてしまってます。が、homeを持たないmysqlとかapacheのユーザもあるので
まともに対応したい方はコード修正してください。
exec("/usr/bin/sudo /usr/sbin/useradd -p '".crypt($_POST['pass'])."' ".$_POST['uname']);
useraddコマンドのパスワードは、cryptを通したもので入れる必要があります。
シングルクォーテーションで囲むのを忘れずに。
参考
ここまで作ったところで、ほかにもやっている人がいるんじゃないの?と
思ってググったら、やっぱりいました。
■PHPでLinuxユーザを追加 - Linux サーバ構築奮闘記
http://fstyle.ddo.jp/archives/2005/07/php_phplinux.html
ここ見たら早くできたのになぁ。