既存のユーザがsu するには、手作業で "wheel" グループに追加してやる必要がある。これはセキュリティ上の理由からのものだから、だれにそのアクセスをあげるかは注意すること。OpenBSD では、wheel グループの人は su(1) ユーザランド・プログラムを使って root になれる。"wheel" にいないユーザは su(1) は使えない。ericjというユーザを"wheel" に追加するときに /etc/group に足すエントリを以下にしめす。
もし新しいユーザの追加を adduser(8)でやっているなら、途中でInvite user into other groups:という設定項目が出てくるので、ここで wheel と答えれば wheel に追加される。これをやると /etc/group にその人が追加され、こんな感じになる:
wheel:*:0:root,ericj
ユーザを"wheel" に加えずに、スーパーユーザの特権の一部をユーザに使わせたい場合には、sudo(8)を使おう。
ファイルシステムの複製には dump(8) と restore(8) を使う。たとえば、SRC ディレクトリ以下のものすべてを DST に複製するには、次のようにする:
# cd /SRC; dump 0f - . | (cd /DST; restore -rf - )
dump はやまほどのバックアップ能力を与えてくれるように設計されているので、単にファイルシステムの一部(あるいは丸ごと)を複製したいくらいのことでいちいち使うようなものでもないかも。それならtar(1)コマンドのほうが高速だ。形式はとても似ている:
# cd /SRC; tar cf - . | (cd /DST; tar xpf - )
OpenBSD は rc(8) スタイルの起動をする。これは起動にいくつか鍵となるファイルを持っている。
システム管理者が専念すべき主要ファイルは、/etc/rc.conf, /etc/rc.local と /etc/rc.shutdown だ。rc(8) の進行を理解してもらうために、以下にフローをつくってみた。:
OpenBSD にデフォルトでついてくるデーモンやサービスのほとんどは、 /etc/rc.conf 設定ファイルをいじるだけで起動時にたちあがるようになる。手始めにまずデフォルトの /etc/rc.conf ファイルを見てやろう。こんな感じの行がいっぱいあるはずだ:
ftpd_flags=NO # for non-inetd use: ftpd_flags="-D"
いまみたいな行は、ftpd はシステム起動時には立ちあがらない、という意味だ(少なくともrc(8) 経由では。くわしくは Anonymous FTP FAQ を読もう)。いずれにしても各行にはコメントがついていて、そのデーモンやサービスの 通常利用 のときの値をしめしている。だからといって、そのデーモンやサービスでそのフラグを使うべし、ということではない。man(1)をいつでも見て、自分の好きな形で起動するようにできる。たとえばhttpd(8)のデフォルトはこんな具合だ:
httpd_flags=NO # for normal use: "" (or "-DSSL" after reading ssl(8))
ここでは明らかに、httpdの起動には、ふつうは何のフラグもいらないということが見て取れる。だからふつうにhttpdを使うだけなら、いまの行を: " httpd_flags=""" にすればいい。でもhttpdを、sslを有効にして立ち上げるには、 "httpd_flags="-DSSL"" というふうに編集しよう(詳しくは SSL FAQ か ssl(8)を参照)。
portsなどほかの方法でシステムにインストールしたその他デーモンにについては、 /etc/rc.local ファイルを使う。たとえば、 /usr/local/sbin/daemonx にデーモンをインストールしたとしよう。これを起動時にたちあげたい。すると /etc/rc.local にこんなエントリを書き加える:
if [ -x /usr/local/sbin/daemonx ]; then echo -n ' daemonx'; /usr/local/sbin/daemonx fi
これ以降は、起動時にこのデーモンが実行される。起動時のエラーも見られる。もしエラーなしでふつうにブートしたら、こんな行が表示される:
Starting local daemons: daemonx.
/etc/rc.shutdownはシャットダウンのときに実行されるスクリプトだ。システムのシャットダウン前にやってほしいことは、すべてこのファイルに記述しておこう。 apm があったら、 "powerdown=YES" も設定しておこう。これは "shutdown -p"と同じだ。
ちょっとこれやってみて:
# cat /etc/mail/sendmail.cf | grep relay-domains
アウトプットはこんな感じだろう:
FR-o /etc/mail/relay-domains
もしこのファイルがないようなら、これをこしらえよう。リモートからメールを送ってくるホストを、以下の構文で記述する必要がある。:
.domain.com # domain.com内のホストからはすべてメールやりとりを認める sub.domain.com # sub.domain.com とそのドメイン内のホストからはすべてメールやりとりを認める 10.2 #IP ネット 10.2.*.*内の全ホストからメールやりとりを認める
これを作り終えたら、sendmail に「HangUP」信号を送るのをお忘れなく(ほとんどのデーモンに設定を読み込みなおさせる信号だ):
# kill -HUP `cat /var/run/sendmail.pid`
POP がらみの問題のほとんどは、一時ファイルとロックファイルの問題だ。pop サーバから次のようなエラーメッセージが出てきたら:
-ERR Couldn't open temporary file, do you own it?
そうしたらファイル属性を次のようにしよう:
permission in /var drwxrwxr-x 2 bin mail 512 May 26 20:08 mail permissions in /var/mail -rw------- 1 username username 0 May 26 20:08 username
もう一つチェックしておきたいのは、ユーザの /var/mail ファイルがそのユーザ自身の所有になっているかどうかだ。もちろんそうなっているはずなんだけれど(つまり /var/mail/joe を所有しているのは joeのはずなんだけれど) もしこれがなぜかまちがっていたら、それが問題のもとだ!
もちろん /var/mail をグループメールで書き込めるようにしたら、あいまいで変てこなセキュリティ上の問題が起きる。たぶんこうしても何の問題もないだろう。でも、問題の可能性はある(特にあなたが有名なサイトを運営していたりISPだったりしたら...)! OpenBSD の ports コレクションからcucipop みたいな POP デーモンを入れて走らせよう。あるいは単に、自分のpopデーモン用に選んだオプションがまちがっているのかもしれない(たとえばdot lockingとか)。あるいはそれがロックをかけるディレクトリを変えればすむ話かもしれない(ただしそうなるとロックは POP デーモンにとってのみ意味があることになるけれど)。
OpenBSD 2.6から、OpenBSD は SSL対応 httpd つきで出荷される。でも各種特許がらみで、いくつかのライブラリは出荷できない。(訳注:2000年9月でこの特許は切れたので、OpenBSD2.8 以降ではこの段落のこれ以降は気にしなくていい)だから RSA 証明書を使うには、システムに追加のライブラリをインストールする必要がある。これは世界でどこにいるかによって、二種類のライブラリになる。 (NOTE: FTP インストールなどのネットワーク経由のインストールをした人は、たぶんすでにこのライブラリもインストール済みだろう)。アメリカ以外に住んでいる人は、"ssl26.tgz"というライブラリ、アメリカ国内の人は"sslUSA26.tgz" を使うこと。これは pkg_add(1) ユーティリティでインストールするものだ。たとえばライブラリの国際版をインストールするには、以下のコマンドを使う。 ${arch} はあなたのマシンのアーキテクチャだ (NOTE:: Alpha アーキテクチャは共有ライブラリがないので、これは使えない)。
# pkg_add ftp://ftp.openbsd.org/pub/OpenBSD/2.6/packages/${arch}/ssl26.tgz
httpd(8) といっしょに使うには、まず証明書をつくらないといけない。これは/etc/ssl/private/に保存される。ここで示すステップは ssl(8) man ページからとったものだ。詳しい話はそっちを見て欲しい。この FAQ は、webサーバ用に RSA 証明書の作り方は説明するけれど、 DSA サーバ証明書には触れない。これが知りたければ ssl(8) man ページを参照。
まず手始めに、自分のサーバのキーと証明書をつくらなきゃ。RSA を使うには、まず libssl をアップグレードしておくおと。これで自分のキーを、OpenSSLを使って生成できる:
# openssl genrsa -out /etc/ssl/private/server.key 1024
あるいはキーをパスフレーズで暗号化して、それをタイプしないとサーバが起動できないようにするには:
# openssl genrsa -des3 -out /etc/ssl/private/server.key 1024
次のステップは、証明書署名要求を出すことだ。これでCertifying Authority (CA) に証明書にサインしてもらえる。やり方は、以下のコマンドを使う:
# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr
これでこの server.csr ファイルは Certifying Authority にわたされ、それがキーにサインしてくれる。こうした CA の一例としては Thawte Certification がある。これは以下の URI でアクセスできる: http://www.thawte.com/。 Thawte はいまのところ RSA キーに署名してくれる。DSA キーも使えるようにするための手続きも進行中だ。
とてもここまでできないよ、とか、証明書は自分でサインすればいいや、という人なら次のようにできる:
# openssl x509 -req -days 365 -in /etc/ssl/private/server.csr \ -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt
/etc/ssl/server.crt と /etc/ssl/private/server.key さえきちんとしていれば、httpd(8) を -DSSL フラグつきで起動できるはずだ。これであなたのマシンも、ポート 443 でhttpsのトランザクションができるはず。
/etc/passwd を編集しても、変更は全部消えてしまう。OpenBSD は /etc/passwd を動的に pwd_mkdb(8)コマンドで生成する。OpenBSD の主パスワードファイルは/etc/master.passwd なのだ。pwd_mkdb(8)によれば、
FILES /etc/master.passwd current password file /etc/passwd a Version 7 format password file /etc/pwd.db insecure password database file /etc/pwd.db.tmp temporary file /etc/spwd.db secure password database file /etc/spwd.db.tmp temporary file
/etc/passwdのような従来の Unix パスワードファイルの場合、ユーザの暗号化パスワードを含む各種情報が、システム上の万人に提供されていた。(おかげで Crack のようなプログラムのいいカモにされる)。4.4BSD で master.passwd ファイルが導入され、これは拡張フォーマットを持っていて(/etc/passwdで提供されていたものよりオプションが増えた)、root しか読めない。もっと高速にデータアクセスするため、このデータにアクセスするライブラリコールはふつうは /etc/pwd.db と /etc/spwd.dbを読む。
OpenBSD は、パスワードファイルを編集するのに使うツールがついてくる。これが vipw(8) だ。Vipw は vi (あるいは$EDITORで定義したお気に入りのエディタ) を使って /etc/master.passwd を編集させてくれる。その編集がすんだら、自動的に /etc/passwd, /etc/pwd.db, /etc/spwd.db を変更にあわせて更新してくれる。 Vipw はまたこれらのファイルのロックも面倒見てくれるので、あなたの編集と同時にだれかがそれを変えようとしたら、アクセス拒否されるようになっている。
OpenBSD 2.6 のユーザなら adduser(8) コマンドがユーザ追加に使える。OpenBSD 2.7 では user(8) コマンドが追加されて、これでユーザやグループの追加と削除の両方ができる。
OpenBSD でユーザ追加にいちばんいい方法は adduser(8) スクリプトを使うことだ。 /etc/adduser.conf を編集すれば、これは好きなようにふるまいを設定できる。vipw(8)を使って手動でユーザを追加してもいいけれど、お奨めなのはadduserのほうだ。adduser(8) は /etc/passwd, /etc/group, と shell データベースに矛盾がないかも見てくれる。 $HOME ディレクトリのエントリも勝手に創ってくれる。さらにはユーザの歓迎メッセージまで送ってくれる。これはあなたのニーズ次第で変えられる。ユーザ追加についてもっと詳しくは adduser_proc(8) man ページを読もう。以下では見本ユーザ testuser をシステムに追加する。この人の $HOME ディレクトリは /home/testuser になって、guest グループに入り、シェルは /bin/kshだ。
# adduser Use option ``-silent'' if you don't want to see all warnings and questions. Reading /etc/shells Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username [a-z0-9_]: testuser Enter full name []: Test FAQ User Enter shell csh ksh nologin sh [ksh]: ksh Uid [1002]: <Enter> Login group testuser [testuser]: guest Login group is ``guest''. Invite testuser into other groups: guest no [no]: no Enter password []: Enter password again []: Name: testuser Password: **** Fullname: Test FAQ User Uid: 1002 Gid: 31 (guest) Groups: guest HOME: /home/testuser Shell: /bin/ksh OK? (y/n) [y]: y Added user ``testuser'' Copy files from /usr/share/skel to /home/testuser Add another user? (y/n) [y]: n Goodbye!
ユーザを削除するには、 rmuser(8) ユーティリティを使う。これはそのユーザの存在をあとかたもなく消す。 crontab(1) の関連エントリも消えるし、$HOME ディレクトリも (オーナーがそのユーザなら)消えるし、メールも消える。もちろん/etc/passwd と /etc/group のエントリも消える。以下は、いま追加したユーザを削除した場合だ。ユーザ名を入力しろとプロンプトされて、ユーザのホームディレクトリを削除すべきか聞かれているのがわかるだろう。
# rmuser Enter login name for user to remove: testuser Matching password entry: testuser:$2a$07$ZWnBOsbqMJ.ducQBfsTKUe3PL97Ve1AHWJ0A4uLamniLNXLeYrEie:1002:31::0:0:Test FAQ User:/home/testuser:/bin/ksh Is this the entry you wish to remove? y Remove user's home directory (/home/testuser)? y Updating password file, updating databases, done. Updating group file: done. Removing user's home directory (/home/testuser): done.
OpenBSD2.7 リリース以降、多くのコマンドがユーザやグループを扱うために追加された。これらのツールはadduser(8) コマンドのような対話型ではないから、スクリプト内で使うのに向いている。
追加されたコマンド一覧を以下に挙げる:
user(8) は対話的に使えないので、ユーザを手軽に追加するいちばん簡単な方法はadduser(8) コマンドを使うことだ。実際のコマンド /usr/sbin/user は、その他の /usr/sbin/user* コマンド群のフロントにすぎない。だから、以下のコマンドは user add や useradd を使えば追加できるし、なにがほしくて、何がいらないかはあなたの選択次第だし、コマンドの使い方は一切変わらない。
この例では、上のadduser でやったのと同じユーザを同じ条件で追加してみようユーザ追加前にデフォルト設定を知っていたほうが、useradd(8) はずっと使いやすい、この設定は /etc/usermgmt.conf に記述してあって、次のようにすると見られる:
$ user add -D group users base_dir /home skel_dir /etc/skel shell /bin/csh inactive 0 expire Null (unset) range 1000..60000
コマンドラインでオプション指定しない限り、この設定が使われる。たとえばここでの例では、ユーザの所属グループは usersではなく guest にしたい。さらにもう一つハードルがある。パスワードはコマンドラインで指定しなきゃいけない。そのパスワードも、暗号化済みのパスワードだ。だからまず encrypt(1) ユーティリティを使ってパスワードを作る必要がある。たとえば OpenBSD のパスワードはデフォルトで Blowfish アルゴリズムを 6 回かける。useradd(8)に指定してやるパスワードをつくるには、まず以下のようにしなきゃいけないわけだ。
$ encrypt -p -b 6 Enter string: <---- ここで使いたいパスワードを入力 $2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq
これで暗号化されたパスワードができたので、ユーザ追加にとりかかれる。
# user add -p '$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq' -u 1002 \ -s /bin/ksh -c "Test FAQ User" -m -g guest testuser
Note: パスワードのストリングを囲むときには、 ' を使うこと。 "ではないよ。シェルがuser(8)に送る前にこれを解釈しちゃうから。加えて、ユーザのホームディレクトリを作って /etc/skel のファイルをコピーしておいてほしければ、-m オプションをつけるのをお忘れなく。
ユーザがちゃんとできたか見るには、いろんなユーティリティが使える。以下に、すべてがきちんとつくれたか見るためのコマンドをいくつか挙げよう。
$ ls -la /home total 14 drwxr-xr-x 5 root wheel 512 May 12 14:29 . drwxr-xr-x 15 root wheel 512 Apr 25 20:52 .. drwxr-xr-x 24 ericj wheel 2560 May 12 13:38 ericj drwxr-xr-x 2 testuser guest 512 May 12 14:28 testuser $ id testuser uid=1002(testuser) gid=31(guest) groups=31(guest) $ finger testuser Login: testuser Name: Test FAQ User Directory: /home/testuser Shell: /bin/ksh Last login Sat Apr 22 16:05 (EDT) on ttyC2 No Mail. No Plan.
これらのコマンドに加えて user(8) は自分なりのユーティリティを提供していて、ユーザ属性を表示できる。これがuserinfo(8)だ。
$ userinfo testuser login testuser passwd * uid 1002 groups guest change Wed Dec 31 19:00:00 1969 class gecos Test FAQ User dir /home/testuser shell /bin/ksh expire Wed Dec 31 19:00:00 1969
user(8) 以下のコマンドでユーザ削除するには、userdel(8) を使う。これはとても簡単だけれど使いやすいコマンドだ。上の例でつくったユーザを削除するには、単にこうすればいい:
# userdel -r testuser
-r オプションに注目。ユーザのホームディレクトリもいっしょに削除してほしければこれが必要だ。あるいは -r のかわりに -p を指定しておいたら、ユーザのアカウントはロックされるけれど、情報はなにも削除されない。
いくつかやり方はあるのだけれど、よく使われるのは /usr/bin/false というのを /etc/shells に追加することだ。そしてユーザを設定するときにそのシェルを /usr/bin/false に指定してやると、対話型のログインはできなくなるけれど、ftp は使えるようになる。adduser(8) を使うと、デフォルトでホームディレクトリが /home/<user> にできる。それでよければ、これはいじらなくていいけれど、でもこれも好きなディレクトリを指定できる。/etc/ftpchrootにこの人のユーザ名を加えておけば、かれが見られるのは自分のホームディレクトリのファイルだけになる。 ftpd(8)で -A オプションを使うと、ftpchrootログインしか受け付けられなくなるよ!
Quota というのは、あるユーザがドライブ上で使うディスクスペースを制限するのに使う。リソースが限られているときにはとても役に立つ。 Quotaの設定方法は2通りある。
quota 設定第一歩は、カーネル設定の中に option QUOTA が入っていることを確かめることだ。これは GENERIC カーネルでは入っている。それから、/etc/fstab の中で quota を有効にするファイルシステムにマークをつけてやること。quota を使うファイルシステムに、userquota と groupquota というキーワードでマークをしてやる。デフォルトで quota.user と quota.group というファイルがそのファイルシステムのルートに創られて、quota 情報が保存される。このデフォルトは userquota=/var/quotas/quota.user とすればオーバーライドされる。もちろんここで指定するのは、quota 情報が入っているどんなファイルでもいい。以下は、userquotaを有効にしたファイルシステムが一つ入った /etc/fstab の例だ。
/dev/wd0a / ffs rw,userquota=/var/quotas/quota.user 1 1
ではユーザの quota を設定しよう。これにはedquota(8)ユーティリティを使おう。簡単な使い方は、単に edquota <user> とすればいい。edquota(8) は vi(1) や、環境変数 EDITOR に設定されたエディタを使って quota を編集する。たとえば:
# edquota ericj
すると出てくる出力はこんな感じだ:
Quotas for user ericj: /: blocks in use: 62, limits (soft = 0, hard = 0) inodes in use: 25, limits (soft = 0, hard = 0)
制限をつけるには、これを編集して次のような感じにしよう:
Quotas for user ericj: /: blocks in use: 62, limits (soft = 1000, hard = 1050) inodes in use: 25, limits (soft = 0, hard = 0)
ここでは softlimit を 1000 ブロックにセットしてあって、hardlimit は 1050 ブロックにせっとしてある。softlimit というのは、ユーザが制限を越えたという警告を受けて、猶予期間をあげるからその間にディスク使用量を減らしなさい、といわれるところだ。猶予期間は eduquota(8) で -t オプションを使えば設定できる。この猶予期間が終わると、softlimit は hardlimit として処理される。これはふつうは、アロケーションエラーを引き起こす。
これで quotas が設定されたので、quota を有効にしよう。これには quotaon(8)を使う。たとえば:
# quotaon -a
これは /etc/fstab を見ていって、quota オプションのついたファイルシステムを有効にしていく。これでquota が有効になったから、quota(1)で見てやれる。quota <user> というコマンドを使えば、そのユーザの情報が見られる。引数なしで呼び出されると、quota コマンドはquota 統計を表示する。たとえば以下のようにしてみよう:
# quota ericj
得られる結果はこんな感じになるはずだ:
Disk quotas for user ericj (uid 1001): Filesystem blocks quota limit grace files quota limit grace / 62 1000 1050 27 0 0
デフォルトで /etc/fstab で設定した quota が起動時にセットされる。これをオフにするには、次のコマンドを使おう:
# quotaoff -a
OpenBSD のユーザ/管理人であるあなたはラッキーですね。KerberosIV がデフォルトシステムのコンポーネントとしてインストールずみなんだから。ここでは Kerberos realm サーバと、クライアントの設定方法を説明しよう。
ものすごく重要なポイントとして、Kerberos クライアントとサーバはシステムの時計がシンクロしていなくちゃだめだ。時計のずれが 5 分以上あったら、変なエラーが出るようになるし、それが時計のずれのせいだとはなかなか気づかないのだ。たとえば:
kinit: Can't send request (send_to_kdc)
あるいはもっとわかりやすいエラーとしてはこんなの:
kauth: Time is out of bounds (krb_rd_req)
システムの時計をシンクロさせる簡単な方法として ntpd がある。これは packages にも入っているし、ports ツリーでも /usr/ports/net/ntp/にある。むかしはxntpdを使っていたけれど、セキュリティ上の問題からもう使われない。というわけで、まずこれをインストールしよう。
ここでのインストールは簡単に packages を使おう。CD-ROM に入っているので(え、持ってない? 買え! あとはまあ OpenBSD サイトから packages を入手することもできる。パッケージを手に入れたらあとは root になって:
# pkg_add -v ntp-blahblahtgz
とすればパッケージのインストールは完了。最後に注意書きが出てきたのをきちんと読もう。まず、/etc/ntp.conf を編集して、再起動しろと書いてある。その通りにしよう。
/etc/ntp.conf には、ntp のサーバ、つまり時間あわせのサーバを書けばいい。どこにサーバがあるかは、ntpサーバのありかページを見て、適当なものを Secondary Server の中から選ぶこと。ぼくのはこんな感じだ。
# cat /etc/net.conf server yamatohime.nmt.ne.jp server azusa.miko.org
これ以外の設定は、packages のほうで全部やってくれる。楽だね。あとは再起動するだけ。これは絶対に必要だ。ntp は、システムの時計というだいじなものをいじるので、いろんなものの前に起動している必要があるからだ。
# reboot
再起動してすぐに、ntpからエラーが出ることがある。システムの時計が狂いすぎていて修正できない、というメッセージだ。これは通常、システムの時計がおかしいのだ。何時間もずれているようだと、そのままではxntp でも修正できない。この場合は /etc/rc.securelevel の ntpd に -g オプションをつけておけば、大幅なずれでも ntp の言うとおりになる。
でもまあこれは手動で時間をなおしたほうが早いだろう。これは手動で時間をなおしてやろう。たとえばいまが 2001年7月24日14:32くらいだとすると:
# date 0107241432
これでいい。数分単位のずれなら、あとはntpがやってくれる。実行されているかな? 以下のコマンドで見てやろう。
# /usr/local/sbin/ntpq -d ntpq > pe remote refid st t when poll reach delay offset disp ============================================================================== +yamatohime.nmt. v7.nmt.ne.jp 3 u 476 512 377 98.19 54.972 65.29 *azusa.miko.org ns.nmt.ne.jp 3 u 254 512 377 104.35 56.456 36.09
うん、なんか動いてるみたいね。
ntpについて詳しくは、ntp 総本山を見てやって欲しい。では Kerberos 本体に移ろう。
FAQ のこの部分は、Kerberos の考え方をあなたが事前に知っているという前提で書かれている。すばらしくわかりやすい参考文献としては、以下がある:
あるいは本だと:
CIARASYSTEMS.COM というrealm で、avalanche.ciarasystems.com を主サーバにして設定しよう。
まず手始めに、設定ファイルの編集が必要だ。このファイルは/etc/kerberosIV/にある。気にすべき二つのファイルは krb.realms と krb.conf だ。じゃあまずはkrb.confから。
[root@avalanche kerberosIV] cat krb.conf CIARASYSTEMS.COM CIARASYSTEMS.COM avalanche.ciarasystems.com admin server
ごらんのように、これで kerberos に、ドメイン(または論理realm) が CIARASYSTEMS.COM で、そのドメインのなかで avalanche が管理サーバだというのが伝わる。次に krb.realms を見てやろう。詳しくは krb.confを参照。
[root@avalanche kerberosIV] cat krb.realms avalanche.ciarasystems.com CIARASYSTEMS.COM .ciarasystems.com CIARASYSTEMS.COM
krb.realms は、ホスト名から そのホストがサービスを提供するKerberos のrealm 名への変換をする。変換ファイルのそれぞれの行は、以下の形式のどれかであるべきだ (domain_name は .XXX.YYYという形式であるべし)。だからこの例では、avalanche は CIARASYSTEMS.COM realm上にあるコンピュータのホスト名だ。ここでも、詳しい情報は the krb.realms man ページを参照。
次に kdb_init(8) を実行して、初期 Kerberos データベースをつくる。
まず、kerberos の作業用データベースを /var/kerberosにつくってから kdb_initを実行しよう。こんな具合だ:
[root@avalanche kerberosIV] mkdir /var/kerberos [root@avalanche kerberosIV] kdb_init Realm name [default NO.DEFAULT.REALM ]: CIARASYSTEMS.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master password: not shown Verifying password - Enter Kerberos master password:
次に kstash(8) を使う。これは Kerberos キー配布センター (KDC) データベースのマスターキーをマスターキーキャッシュファイルに入れるものだ。
[root@avalanche kerberosIV] kstash Enter Kerberos master password: Current Kerberos master key version is 1. Master key entered. BEWARE! Wrote master key to /etc/kerberosIV/master_key
これで暗号化されたマスターパスワードが /etc/kerberosIV/master_keyに保存された。
次に、Kerberosで保護されるシステムのそれぞれについて、二つの principals がデータベースに追加される必要がある。kpasswd と rcmd の二つだ。この2つの principals はがそれぞれのシステム用につくられ、インスタンスは個別システム名になる。
kpasswd and rcmd というデーモン二つは、他のシステムが Kerberosのパスワードを変えたり、rcp, rlogin rshなどのコマンドを実行できるようにする。
# kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: avalanche <Not found>, Create [y] ? y Principal: passwd, Instance: avalanche, kdc_key_ver: 1 New Password: <----- ここでは「RANDOM」と入力する Verifying password - New Password: Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 1999-12-31 ] ? 2001-12-31 Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: avalanche <Not found>, Create [y] ? y Principal: rcmd, Instance: avalanche, kdc_key_ver: 1 New Password: <----- ここでは「RANDOM」と入力する Verifying password - New Password: Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 1999-12-31 ] ? 2001-12-31 Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <----- <ENTER> を押すと終了
srvtab ファイルというのがサービスキーファイルだ。各サービスがKerberos利用を認証するためには、これはKerberos キー配信センターのデータベースから抜き出したものでなくてはならない。コマンドラインで指定された各ホスト名ごとに、ext_srvtab(8) がサービスキーファイルの hostname-new-srvtab をつくる。ここにはホスト名をインスタンスのフィールドに持つすべてのエントリが含まれている。
[root@avalanche kerberosIV] ext_srvtab avalanche Enter Kerberos master password: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'avalanche-new-srvtab'.... [root@avalanche kerberosIV] mv avalanche-new-srvtab srvtab [root@avalanche kerberosIV] chmod 600 srvtab
これでこんどは、ユーザをデータベースに追加できる。
[root@avalanche kerberosIV] kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jeremie Instance: <Not found>, Create [y] ? y Principal: jeremie, Instance: , kdc_key_ver: 1 New Password: <---- ここで安全なパスワードを入力 Verifying password New Password: <---- パスワード再入力 Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- ここでリターンだけ押すと終了。続けて エントリを足してもいい。
というわけで、これで Kerberos のいろんなものが設定された。あとは起動時に Kerberos サーバがロードされるようにして、ケルベロス化されたデーモンを有効にするだけ。
In /etc/rc.conf, set:
kerberos_server=YES
In /etc/inetd.conf, uncomment:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -k klogin stream tcp nowait root /usr/libexec/rlogind rlogind -k kshell stream tcp nowait root /usr/libexec/rshd rshd -k kauth stream tcp nowait root /usr/libexec/kauthd kauthd
Then, either reboot, or:
[root@avalanche /] kill -HUP `cat /var/run/inetd.pid` [root@avalanche /] /usr/libexec/kerberos >> /var/log/kerberos.log & [root@avalanche /] /usr/libexec/kadmind -n >> /var/log/kadmind.log &
Note: これはかなり単純なサーバ設定だ。ふつうはサーバを二重化しておいて(一つをスレーブにして)、片方のサーバがダウンしてもKerberos に依存しているサービスすべてがダウンしたりしないようにする。また指定の principal に「su」権限を与えるにはthe FreeBSD Handbookを参照。
……ともったいをつけずに、su 権限を追加してみよう。やりかたは簡単だ。上のところで、Principal nameを入力したあとに「Instance」を入力するところが出てきて、上では何も入れずにリターンを押した。su権限を与えるには、その Instanceのところで「root」と入力すればいいだけだ。あとはまったく同じ。上で指定した jeremie に、su権限を与えてみよう。もちろんそれ以前に、jeremieはwheelグループに参加している必要がある。これについてはFAQ 10.1を参照。
[root@avalanche kerberosIV] kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jeremie Instance:root <Not found>, Create [y] ? y Principal: jeremie, Instance:root , kdc_key_ver: 1 New Password: <---- ここでrootパスワードを入力 Verifying password New Password: <---- パスワード再入力 Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 20 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- ここでリターンだけ押すと終了。続けて エントリを足してもいい。
上の例と一つだけちがうのが、Max ticket lifetimeの指定のところだ。suはなるべく一時的にしておきたいし、長期でチケットが生き残るとセキュリティ上の問題になることがある。だからチケットの寿命は短くしておこう。せいぜい 20 分とか。これについては、デフォルト値も自動的に配慮してくれている。
gatekeeper というワークステーションを、 CIARASYSTEMS.COM realm にいるものとして設定し、メインのサーバを avalanche.ciarasystems.com にするように設定しよう。
まず手始めに、上のマシンと同じように krb.conf と krb.realms を設定しよう。これは gatekeeper が、KDC がどのサーバか、どのドメイン上にいるかわかるようにするためだ。ファイルの中身をもう一度挙げておこう。
[root@gatekeeper kerberosIV] cat krb.conf CIARASYSTEMS.COM CIARASYSTEMS.COM avalanche.ciarasystems.com admin server [root@gatekeeper kerberosIV] cat krb.realms avalanche.ciarasystems.com CIARASYSTEMS.COM .ciarasystems.com CIARASYSTEMS.COM
では設定がすんだので、kerberos を初期化しよう。チケットをもらうには、kinit(1)を使う。
xyz:jeremie% kinit The OpenBSD Project (gatekeeper) Kerberos Initialization Kerberos name: jeremie Password:
これで同定されたから、klist(1)でチケット一覧を表示して自分のが出るか見てみよう。
xyz:jeremie$ klist Ticket file: /tmp/tkt1000 Principal: jeremie@CIARASYSTEMS.COM Issued Expires Principal Jun 28 01:03:25 Jun 28 11:03:25 krbtgt.CIARASYSTEMS.COM@CIARASYSTEMS.COM
なんかうまくいったみたいだね。あとはテストしてみるだけだ。ここでは、rlogin(1) と telnet(1)でテストしてみよう。
xyz:jeremie% telnet avalanche Trying 192.168.0.38... Connected to avalanche. Escape character is '^]'. [ Trying mutual KERBEROS4 ... ] [ Kerberos V4 accepts you ] [ Kerberos V4 challenge successful ] Last login: Sun Jun 27 22:52:25 on ttyp1 from gatekeeper Warning: no Kerberos tickets issued. OpenBSD 2.5 (AVALANCHE) #5: Tue Apr 6 01:18:16 EDT 1999
あるいは
xyz:jeremie% rlogin avalanche Last login: Sun Jun 27 22:53:39 on ttyp1 from gatekeeper Warning: no Kerberos tickets issued. OpenBSD 2.5 (AVALANCHE) #5: Tue Apr 6 01:18:16 EDT 1999
これで確かに rlogin セッションの認証に Kerberos が使われているのがわかる。発行されたチケットをどれでも削除するには、kdestroy(1)を使う。たとえば:
xyz:jeremie% kdestroy Tickets destroyed. xyz:jeremie% rlogin avalanche krcmd: No ticket file (tf_util) rlogin: warning, using standard rlogin: can't provide Kerberos auth data. avalanche: Connection refused
「Warning: no Kerberos tickets issued」とでてきてもご心配なく。これは、ここでは kerberos 認証をしているだけで、ticket passing はしていないからだ。もし ticket passing をしたければ、それをサポートしているOpenSSH を使おう。そのままの KerberosIV は tgt passing のサポートもない―― AFS kaserverによる krb4 の実装しかない。通常の KerberosIV kdc は ticket にリストされたクライアントの IP アドレスをチェックするからだ。
Anonymous FTP は、アカウントのない人たちにFile Transfer Protocol を使ってあなたのコンピュータ上のマシンにアクセスさせるものだ。以下に、このanonymous FTP サーバの概観、そのログとりその他の設定について述べる。
まず手始めに、システム上に "ftp" というアカウントが必要だ。このアカウントは、使用可能なパスワードを持ってはいけない。ここではログインディレクトリを /home/ftp にするけれど、どこでも好きなところに指定してかまわない。anonymous ftp を使うとき、ftp は chroot して 'ftp' ユーザのホームディレクトリに移る。これについて詳しく知りたければ ftp(8) と chroot(2) man ページを参照。以下に ftp ユーザ追加の例を挙げる。ここでは adduser(8)を使う。 さらに /etc/shells に /usr/bin/false を追加しておこう。これがこの ftp ユーザにあげる "シェル" だ。このためかれらは、空のパスワードをもらってもログインできない。これには簡単に echo /usr/bin/false >> /etc/shellsとすればよろしい。で、adduser の質問のときにそのシェルがあらわれるようにしたければ、 /etc/adduser.confも変更しておくこと。
oshibana# adduser Use option ``-silent'' if you don't want see all warnings & questions. Reading /etc/shells Check /etc/master.passwd Check /etc/group Ok, let's go. Don't worry about mistakes. I will give you the chance later to correct any input. Enter username [a-z0-9_]: ftp Enter full name []: anonymous ftp Enter shell csh false ksh nologin sh tcsh zsh [sh]: false Uid [1002]: Login group ftp [ftp]: Login group is ``ftp''. Invite ftp into other groups: guest no [no]: no Enter password []: Use an empty password? (y/n) [y]: y Name: ftp Password: **** Fullname: anonymous ftp Uid: 1002 Gid: 1002 (ftp) Groups: ftp HOME: /home/ftp Shell: /usr/bin/false OK? (y/n) [y]: y Added user ``ftp'' Copy files from /usr/share/skel to /home/ftp Add another user? (y/n) [y]: n Goodbye!
ユーザそのものといっしょに、いまので /home/ftp というディレクトリができた。これはこっちの希望通りだけれど、anonymous ftp で使ってもらうにはもうちょっと細工が必要だ。この細工については
ftp(8) man ページに説明してある。
/home/ftp/usr or /home/ftp/bin ディレクトリは作らんでよろしい。
以上のディレクトリはすべて、所有者を「root」にしておく。以下に、最終的にディレクトリがどんな感じになるかを示しておこう。
oshibana# pwd /home oshibana# ls -laR ftp total 5 dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 . drwxr-xr-x 7 root wheel 512 Jul 6 10:58 .. dr-x--x--x 2 root ftp 512 Jul 6 11:34 etc dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 pub ftp/etc: total 43 dr-x--x--x 2 root ftp 512 Jul 6 11:34 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 .. -r--r--r-- 1 root ftp 316 Jul 6 11:34 group -r--r--r-- 1 root ftp 40960 Jul 6 11:34 pwd.db ftp/pub: total 2 dr-xr-xr-x 2 root ftp 512 Jul 6 11:33 . dr-xr-xr-x 5 root ftp 512 Jul 6 11:33 ..
ftpd の場合、これを inetd から実行するのか、あるいは rc スクリプトで開始するのか選べる。以下の例では、デーモンを inetd.confから起動することにしよう。 まずはftpdのオプションいくつかを頭に入れておこう。/etc/inetd.conf is: のデフォルトの記述はこうだ:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US
ここでは ftpd は -US オプションで起動されている。これは anonymous 接続を /var/log/ftpd にログして、同時に発生するセッションを /var/run/utmp にログする。これでセッションが who(1) で見られるようになる。なかには、 anonymous サーバだけを走らせて、ユーザには ftp を許可しないようにしたい人もいるだろう。これには ftpd を -A オプションで起動する。以下に挙げるのは、ftpd を anonymous 接続でのみ認める形で起動する例だ。さらに -ll オプションもついている。これはそれぞれの接続を、get, retrieveなどの ftp コマンドとあわせて syslog にログする。
ftp stream tcp nowait root /usr/libexec/tcpd ftpd -llUSA
Note - トラフィックのすごく高い ftp サーバを運用する人は、ftpd を inetd.conf から起動しないほうがいいかも。いちばんいいのは、inetd.conf の ftpd をコメントアウトして、ftpd を -D オプションつきで rc.conf から起動することだ。これで ftpd はデーモンとして起動して、inetd から起動するよりオーバーヘッドもずっと小さくなる。rc.conf から起動するときの記述例はこんな感じだ。
ftpd_flags="-DllUSA" # for non-inetd use: ftpd_flags="-D"
これはもちろん、/etc/inetd.confから ftpd をはずしておかないとうまくいかない。
OpenBSDの ftpd(8) は、デフォルトでこれを簡単にこなせるようになっている。これは /etc/ftpchroot ファイルを使えば実現できる。ユーザは必ずしも信用できるとは限らないから、ホームディレクトリに押し込めておくことも必要になる。これはデフォルトでは、有効になっていない。デフォルトのふるまい例を以下に示そう。
$ ftp localhost Connected to localhost. 220 oshibana FTP server (Version 6.4/OpenBSD) ready. Name (localhost:ericj): ericj 331 Password required for ericj. Password: ********* 230- OpenBSD 2.6 (GENERIC) #690: Fri Oct 29 16:32:17 MDT 1999 230- 230- Welcome to OpenBSD: The proactively secure Unix-like operating system. 230- 230- Please use the sendbug(1) utility to report bugs in the system. 230- Before reporting a bug, please try to reproduce it with the latest 230- version of the code. With bug reports, please try to ensure that 230- enough information to reproduce the problem is enclosed, and if a 230- known fix for it exists, include that as well. 230- 230 User ericj logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd / 250 CWD command successful. ftp> ls 227 Entering Passive Mode (127,0,0,1,60,7) 150 Opening ASCII mode data connection for 'file list'. altroot bin dev etc home mnt root sbin stand tmp usr var bsd sys boot 226 Transfer complete. ftp> quit 221 Goodbye.
ごらんのとおり、全サーバへのアクセスが認められてしまう。この世が完璧であらゆるユーザが全面的に信用できるのであれば、これでもよいのだけれど、残念ながらそうはいかない。ユーザを制限するには、そのユーザ名を /etc/ftpchroot ファイルに記述しておく。以下の例では、 "ericj" というユーザが制限されている。
$ cat /etc/ftpchroot # $OpenBSD: faq10.html,v 1.47 2000/07/09 00:42:27 ericj Exp $ # # list of users (one per line) given ftp access to a chrooted area. # read by ftpd(8). ericj
これだけで、"ericj" というユーザは自分のディレクトリから出られなくなる。次の例でわかるように、 / ディレクトリがいきなりこの人のホームディレクトリになっている!
$ ftp localhost Connected to localhost. 220 oshibana FTP server (Version 6.4/OpenBSD) ready. Name (localhost:ericj): ericj 331 Password required for ericj. Password: ********* 230 User ericj logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd / 250 CWD command successful. ftp> ls 227 Entering Passive Mode (127,0,0,1,92,171) 150 Opening ASCII mode data connection for 'file list'. .login .mailrc .profile .rhosts .ssh .cshrc work mail src 226 Transfer complete. ftp> quit 221 Goodbye.
OpenBSD ソースツリーはたえず変化して改善されているし、同時によくある問題へのフィックスもされて、そのためのパッチが公開される。こうしたパッチは errata ウェブページ(http://www.openbsd.org/errata.html)で公開されて、カテゴリー別にわかれている。こうしたカテゴリーはアーキテクチャごとに適用されるべきパッチと、アーキテクチャと関係なく適用すべきパッチとにわかれる。
でも、パッチは OpenBSD への機能追加のためには行われないことに注意。これは、すぐに対応が必要な、だいじな信頼性改善やセキュリティ上の問題への対応のためだけに使われる。ただしそれに対応するかどうかは、いつもながら、システム管理者次第だ。
たとえば talkd(8) に、errata.htmlからのパッチをあててみよう。
http://www.openbsd.org/errata.html にポストされるパッチは、最新リリースソースツリーに対するものだ。最新の CVS ツリーに対するパッチは、リリースシステムでは求められないようなその他の変化が入っているかもしれない。
OpenBSD オペレーティングシステム用のパッチは、diffで配布されている。これはもとのソースコードから変わった部分を含んでいるテキストファイルだ。これはバイナリ形式では配布されていない。つまりシステムをパッチするには、OpenBSD リリースバージョンのソースコードが手元にないとダメだ。OpenBSDのソースコードが全部そろっている必要はないけれど、自分がパッチするプログラムの分は全部必要だ。たとえばカーネルをパッチするなら、カーネルのソースが手元に要るのだ。
cvs(1) を使うと、手軽に好きな anonymous cvs サーバから、自分の必要なソースだけを持ってこられる。サーバ一覧は http://www.openbsd.org/anoncvs.html を参照。
最新リリースソースコードをcvs(1) でもってくるには、以下のコマンドを使う:
$ cvs -danoncvs@anoncvs5.usa.openbsd.org:/cvs co -rOPENBSD_2_7_BASE src/libexec/talkd/ cvs server: Updating src/libexec/talkd U src/libexec/talkd/announce.c U src/libexec/talkd/talkd.c U src/libexec/talkd/talkd.h
自分のほしいコードの CVS パスを調べるには、あてたいパッチの Index: 行を見るのだ。ここでは CVS パスは src/libexec/talkd/ だ。必ず OPENBSD_version_number_BASE のリビジョンをチェックしよう。"BASE" がないと、安定ブランチをチェックアウトしていることになる。これはじゃまになるほかのコードが入っているかもしれない。すでにパッチブランチをおっかけているなら、パッチはすでにソースに含まれているはずだけれど、必ずチェックして確かめよう。http://www.openbsd.org/plus.html を見れば、どのパッチがパッチブランチに適用されたかはわかる。もしパッチがまだあたっていないあったら、上のコマンドを須加って最新リリースソースコードを持ってこよう。
あと、公式 OpenBSD CD を買った人は、直接 CD からソースコードをとってくるといい。CD からソースをとってくる方法については、CD 付属の紙を見よう。こうすれば、anoncvs経由でソースを持ってこなくていい。
Apply by doing: cd /usr/src patch -p0 < 026_talkd.patch cd libexec/talkd make obj && make depend && make && make install Index: libexec/talkd/announce.c <------ Path to sources =================================================================== RCS file: /cvs/src/libexec/talkd/announce.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- libexec/talkd/announce.c 1998/08/18 03:42:10 1.8 +++ libexec/talkd/announce.c 2000/07/06 00:01:45 1.9 @@ -160,6 +160,6 @@ *(bptr++) = '\n'; } *bptr = '\0'; - fprintf(tf, big_buf); + fprintf(tf, "%s", big_buf); fflush(tf); }
しかるべきソースを手に入れたら。パッチをもってきて、src/に置いてやる。
$ cd /usr/src $ patch -p0</path/to/026_talkd.patch Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |Apply by doing: | cd /usr/src | patch -p0 < 026_talkd.patch | cd libexec/talkd | make obj && make depend && make && make install | |Index: libexec/talkd/announce.c |=================================================================== |RCS file: /cvs/src/libexec/talkd/announce.c,v |retrieving revision 1.8 |retrieving revision 1.9 |diff -u -r1.8 -r1.9 |--- libexec/talkd/announce.c 1998/08/18 03:42:10 1.8 |+++ libexec/talkd/announce.c 2000/07/06 00:01:45 1.9 -------------------------- Patching file libexec/talkd/announce.c using Plan A... Hunk #1 succeeded at 160. <------------ Patch Succeeded done $ cd /usr/src/libexec/talkd/ $ ls CVS announce.c print.c table.c talkd.c Makefile announce.c.orig process.c talkd.8 talkd.h $ make obj && make depend && make making /home/ericj/lsrc/src/libexec/talkd/obj mkdep -a /home/ericj/lsrc/src/libexec/talkd/talkd.c /home/ericj/lsrc/src/libexec/talkd/announce.c /home/ericj/lsrc/src/libexec/talkd/process.c /home/ericj/lsrc/src/libexec/talkd/table.c /home/ericj/lsrc/src/libexec/talkd/print.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/talkd.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/announce.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/process.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/table.c cc -O2 -c /home/ericj/lsrc/src/libexec/talkd/print.c cc -o ntalkd talkd.o announce.o process.o table.o print.o nroff -Tascii -mandoc /home/ericj/lsrc/src/libexec/talkd/talkd.8 > talkd.cat8 $ sudo make install install -c -s -o root -g bin -m 555 ntalkd /usr/libexec install -c -o root -g bin -m 444 talkd.cat8 /usr/share/man/cat8/talkd.0 /usr/share/man/cat8/ntalkd.0 -> /usr/share/man/cat8/talkd.0
これが終わったら、該当サービスを再起動しよう。
[FAQ トップへ]
[9.0 - Linux からのお引っ越し]
[11.0 - パフォーマンスのチューニング]
www@openbsd.org 翻訳上の問題はhiyori13@alum.mit.edu
$OpenBSD: faq10.html,v 1.53 2001/04/22 05:33:54 austin Exp $