LinuxのユーザをWebから追加する方法

たとえば部署のローカルサーバを新しく立てるときに、全員に
「ユーザを作るのでパスワードを登録しに来て下さい」と言うのも面倒だし
「仮パスワードで作るのでユーザ名を教えてください」というのも面倒。
そうはいっても「rootのパスワードを教えるから自分で登録してください」
というのもセキュリティ的にやりすぎ。


一時的にでいいので、自分でユーザ登録してもらうために、
Webページ経由でユーザを追加できるものを作ってみました。

方針

  • phpのWebページを作って、useraddコマンドをWeb経由でやってもらう。
  • useraddコマンドはrootしかできないので、sudoでrootとして実行できるようにする。

1. apacheのユーザにsudoの権限を付ける

httpdのユーザが「apache」の場合、visudoコマンドを使って
apacheがsudo経由でuseraddコマンドを実行できるようにします。


なお、手元のLinuxRHEL)では、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'>&lt;&lt;-- 登録ページに戻る</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を通したもので入れる必要があります。
シングルクォーテーションで囲むのを忘れずに。

参考

ここまで作ったところで、ほかにもやっている人がいるんじゃないの?と
思ってググったら、やっぱりいました。


PHPLinuxユーザを追加 - Linux サーバ構築奮闘記
http://fstyle.ddo.jp/archives/2005/07/php_phplinux.html


ここ見たら早くできたのになぁ。