PHP PHPでLinuxユーザを追加 その1

Vine Linux を使ってサーバ構築・運営していくためのノウハウをまとめてみました。|
PHP PHPでLinuxユーザを追加 その1
  
line

PHP PHPでLinuxユーザを追加 その1

Thursday, Jul, 28, 2005
line

コマンドライン上からLinuxユーザを作成するには、以下のような感じになります。
ユーザ名グループ名は同じ「 user01 」とし、「 /home 」以下にユーザ名と同じディレクトリを作成。
ログインシェルを「 /bin/bash 」とします。
パスワードは「 abcd 」にします。

# useradd user01  -s /bin/bash
#

次にパスワードを設定します。

# passwd user01
Changing password for user user01.
New password: ←実際には「 abcd 」を入力
BAD PASSWORD: it's WAY too short
Retype new password: ←実際には「 abcd 」を入力
passwd: all authentication tokens updated successfully.
#


useradd 」コマンドに「 -p 」オプションをつけてやると、ユーザの作成と同時にパスワードを設定してくれますが、この時渡す値は暗号化された値なので、どちらにしろ暗号化処理は必要になってきます。
VineLinuxでは、「 $1$ で始まる12文字の暗号化ベース文字を有するMD5暗号」になっているようです。
よって、暗号化されたパスワード(/etc/shadow に記述されている)を見てみると「 $1$ 」ではじまり32文字が続いた値になっているはずです。
例) $1$abcdefghijklmnopqrstuvwxyz012345

ブラウザ上からユーザの作成が出来ると楽ですよね。
というより、アクセス認証が必要なサイト等を作るには、ブラウザ上からこうした作成をユーザにやってもらう事になるでしょう。
ここでは簡単にそれを実現するためのPHPソースを公開します。
一応、今回はメールアカウントだけ取得できるといった条件とします。つまり、ログインも出来ない(SSHやFTP等で)し「 /home 」以下にもユーザのディレクトリは作成されません。

まず、これを実現するに当たって、Apacheが「 useradd 」コマンドを使用できるようにしてやらなくてはなりません。
コマンドライン上で、以下のように打ち込んで「 sudo 」が実行できるユーザと実行できるコマンドを登録します。
# visudo
※vi が立ち上がり 「 /etc/sudoers 」ファイルが開きます
※ 「 i 」キーを押し編集モードにし、カーソルを最終行まで移動させ
以下のように打ち込む。

apache ALL=NOPASSWD: /usr/sbin/useradd


※ 打ち終わったら、「 Esc 」キーを押し(編集モード終了)、
「 :wq! 」と押していきエンターを押す(保存して vi を終了)


これで「 useradd 」コマンドは「 apache 」ユーザからパスワードなしで使用できるようになりました。
※ このことは、非常に危険な設定をしていると認識しなければなりません。
Apacheのセキュリティホールを突かれてApacheになりすますことが出来たのなら、権限の強いユーザを作成されてしまう可能性があります。
そしてそれは防ぎようがありません。

次に、ユーザを作成するPHPスクリプトの方は、以下のようになります。

<?
$user = "user01";
$pass = "abcd";
$passed = crypt($pass , "AB");
$command = "sudo /usr/sbin/useradd -M " . $user
. " -s /bin/false -p " . $passed;
system($command , $status);
print $status;
?>


sudo 」コマンドに「 useradd 」コマンドを渡しています。
-M 」オプションは、ホームディレクトリを作成しない設定です。もしホームディレクトリを作成したい場合はこのオプションははずしてください。
-s 」オプションは、ログインシェルを指定します。
デフォルトでは「 /bin/bash 」ですが、ログインさせたくないときは「 /bin/false 」を指定します。
-p 」オプションは、暗号化されたパスワードを指定します。

VineLinuxでは、暗号化後は
$1$abcdefghijklmnopqrstuvwxyz012345
といった形になります。
$1$ 」に32個の文字列が続きます。
これはPHPの「 crypt 」関数の第一引数にパスワードを与えた場合と同じ値になりますが、ここで「 $1$ 」 + 32文字を渡すと、途中で削られてしまうようです。
ここには、PHPの「 crypt 」関数の第一引数にパスワードを、第二引数に暗号化のベースとなる2文字を指定するとうまくいきます。
今回は「 AB 」を渡しましたが、なんでもかまいません。

うまくいくと $status には、「 0 」が入っているはずです。

投稿者 campanella : 2005年07月28日 12:17 | Linux Tips | PHP | 編集
line
□□□ トラックバック □□□

このエントリーのトラックバックURL:

□□□ コメント □□□

line
名前
メールアドレス
URL
コメント
 
 
  kado