[PHP-users 9552] Re: phpで useradd+passwd する方法

TAKAHASHI Masayoshi php-users@php.gr.jp
Tue, 27 Aug 2002 23:59:11 +0900


高橋征義です。

加藤昌也 <kato@nil.co.jp>さん:
> > useradd と、 passwd との同様を機能を phpで記述したいのです。
(略)
> この話題は毎月のように質問されています。
> 過去ログをまず調べてみましょう。

私も調べてみましたが、毎月のように質問されているわりには、
これといっていい投稿(のまとめ)はないように見えました。

というわけで、書いてみました。何か間違い等があればご指摘
いただけるとうれしいです。

------------------------------------------------------------------
Q. useraddコマンドのように、ユーザを追加する機能をPHPで実現するには?

A. いくつかの方法があります。

   1) sudo等を使ってuseraddを実行する。

      useraddは通常、限られたユーザでしか実行できません。
      そのため、sudoなどを使って、PHPの実行ユーザ(nobodyや
      apacheなど)からuseraddを実行できるようにする必要があります。
      sudo等の使い方はOSのマニュアルを参照してください。

      もっとも、sudoなどで管理者用アカウント以外に管理用コマンドの
      実行権限を与えてしまうのは、セキュリティ的に最適な方法では
      ありません。下記 2)も参照してください。

      (参考URL:
         [PHP-users 8418]
         http://ns1.php.gr.jp/pipermail/php-users/2002-July/008423.html
         [PHP-users 7451]
         http://ns1.php.gr.jp/pipermail/php-users/2002-May/007459.html )


   2) ユーザ追加用の情報をいったんどこかに保存し、後で自動的に
      ユーザの追加を行う。

      1)の問題を避けるため、直接登録せず、別途useraddの実行権限を
      持つプログラムが登録させることもできます。

      例えば、以下のようなやり方が考えられます。

      ・追加情報登録DB(もしくはファイル)などを用意し、そこに
        ユーザ名とパスワード(をcryptしたもの)を登録する。
        Web上では、「ユーザ登録情報を記録しました。登録は後ほど
        行われます。登録完了後、結果をメールでお送りします」など
        と表示させる。
      ・そして、シェルスクリプトやコマンドライン用PHPスクリプトで、
        追加情報登録DBの情報を元に、useraddを行い、結果をメール
        で送信するスクリプトを書き、それを定期的に実行させる
        (定期実行にはcronを利用する)。

      こうすると、Webサーバで実行されるPHPスクリプトと、ユーザの
      登録を行うスクリプトを分離できるので、実行権限の設定が
      簡潔になります。しかし、リアルタイムで更新できるわけでは
      ないので、用途によっては不便かもしれません。

      定期実行させる時間間隔等は、使用する環境によって判断して
      ください。また、メールではなくどこかにログを吐かせる、と
      いう方法もよいでしょう。


   3) DBを使ってユーザ管理を行うようにし、そのDBに登録する。

      要するにユーザ管理を行うためのユーザ情報を変更したいわけ
      ですから、ユーザ管理自体を /etc/* 等のファイルではなく、
      PostgreSQLなどのDBで行うようにさせてしまえば、あとはDBの
      操作でユーザが登録できるようになるわけです。
      
      もっとも、この方法では、ユーザ情報の管理に汎用のDBを使う
      ことになるわけですから、セキュリティの確保には細心の注意を
      払う必要があります。
      詳しくはOSやDBのマニュアルを読み込み、それぞれのセキュリ
      ティモデルとその設定方法をちゃんと理解した上で使いましょう。

      (参考URL:
       [PHP-users 8460]
       http://ns1.php.gr.jp/pipermail/php-users/2002-July/008465.html )

------------------------------------------------------------------


ところで、[PHP-users 7449]
( http://ns1.php.gr.jp/pipermail/php-users/2002-May/007457.html )
のスレッドでは、sudoなしで登録できているようにみえるのですが、
これはどういう方法を使っているのでしょうか?

あと、上の1)のURLにある方法では、useraddが失敗した場合のエラー
処理がないですね。これってsystemの第二引数などを使って判断する
ことになると思うんですが、どう書くのがいいんでしょう?

# 元メールによれば「エラーにはなりませんが、ユーザー・パス共に登録
# できていたせんでした。」とのことですが、これはuseraddの問題だけ
# ではなく、「適切にエラー報告が行えていない」というPHPスクリプト側
# の問題でもある、と考えるべきでしょう。
# ま、エラーハンドリングは何かとめんどくさくて手抜きがちになりやすい
# ところですが。

# ……ちなみに私は「そもそもuseraddってナニ?」と思ってしまう
# FreeBSDユーザだったりします(^_^;


高橋征義 (TAKAHASHI Masayoshi)       Email:maki@inac.co.jp
情報量の少ない質問・回答を撲滅するにはFAQが必須ではないかと。