カテゴリー別アーカイブ: CentOS

ApacheのBasic認証にLDAPを利用する

apacheのBasic認証にLDAPを利用しようとしてみた。

サーバはOpenLdap24 on FreeBSD, クライアントはApache22 on CentOS6.2。

今回の方法はBasic認証でアクセス制御をしたい箇所に.htaccessを設置してみた。

shell> more .htaccess

AuthzLDAPAuthoritative off
AuthName "ldap ninshou dayoyo"
AuthType Basic
AuthBasicProvider ldap
#LDAPVerifyServerCert off
AuthLDAPURL ldaps://192.168.1.1/ou=People,dc=example,dc=com?uid
Require valid-user

コレだとうまくいかない。500のInernal Server Errorが帰ってしまう。ユーザ名とパスワードの組み合わせがうまくいかないのかと思いきや、他の手段で認証を試すとうまく通ってる。

apacheのerror_logをdebugレベルまで引き上げてログを見てみた。

shell> more httd-vhosts.conf

…前略…

# ldaptest
<VirtualHost *:80>
ServerAdmin hogetan<a href="mailto:[email protected]">@l2tp.org</a>
DocumentRoot /home/hogetan/public_ldap
ServerName ldap.l2tp.org
LogLevel debug
ErrorLog /var/log/httpd/ldap.l2tp.org-error.log
CustomLog /var/log/httpd/ldap.l2tp.org-access.log combined
</VirtualHost>

…後略…

shell> tail /var/log/httpd/ldap.l2tp.org-error.log

[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(393): [client 192.168.1.5] [29473] auth_ldap authenticate: using URL <a href="ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid">ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid</a>
[Tue Feb 28 09:43:23 2012] [info] [client 192.168.1.5] [29473] auth_ldap authenticate: user yubird authentication failed; URI /favicon.ico [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]
[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(1105): [29467] auth_ldap url parse: `ldaps://192.168.1.1/ou=People,dc=l2tp,dc=org?uid', Host: 192.168.1.1, Port: 636, DN: ou=People,dc=l2tp,dc=org, attrib: uid, scope: base, filter: (null), connection mode: using SSL

なんかエラー出てる。Can’t contact LDAP serverとか言われてる。

いろいろ悩んで湯バード先生にヘルプを求めた結果、ldapsのsがいけないんじゃ無いか、ってことに。sslの証明書の検証が悪いのではないか、ということだ。今回のldapサーバはオレオレ証明書を利用しており、今までもldap.confなどでことごとく証明書の認証でコケた経験があった。

試しにldapsじゃない、ldapな待ち受けに接続にいくとすんなりつながった。

で、証明書の検証をしないようにするオプションを探して有効にしてみた。

http://httpd.apache.org/docs/2.2/mod/mod_ldap.html#ldapverifyservercert

このオプションで注意しなくてはいけないのは、.htaccessなどには記述できない、ということ。virtualhostディレクティブとかでもダメ、グローバルディレクティブじゃないとダメっぽい。

shell> grep LDAPVerify httpd.conf

LDAPVerifyServerCert Off

この設定を入れたらldapsでもうまくいった。

とにかくldaps+オレオレ証明書の場合には証明書の検証問題に注意しろ、ってことで。めでたしめでたし。

CentOS 6.0をアップデートしたらLDAPで認証が通らなくなった

CentOS 6.0をアップデートしたらLDAPで認証されるユーザが存在しないことになってた。

ただ今回のアップデートはyum updateで一括してアップデートしてしまったのでOpenLDAPのアップデートでそうなったのかOS本体のアップデートでそうなったのかちょっと区別が付かなかった。

CentOSの場合、以下のファイルがLDAP認証に関わってくる

  • /etc/nscl.conf
  • /etc/nsswitch.conf
  • /etc/pam_ldap.conf
  • /etc/openldap/ldap.conf
  • /etc/sysconfig/authconfig
  • /etc/pam.d/*

これらのファイルの内、アップデートによりデフォルトのものに書き換えられたものがある様子。

shell> id hogetan
id: hogetan: No such user

shell> grep LDAP /etc/sysconfig/authconfig
USELDAPAUTH=no  # この行をyesに変更しなければならない。アップデートでnoになってしまった様子。
USELDAP=yes

shell> tail /var/log/messages

Dec 19 11:39:37 clinton nslcd[1861]: [7b23c6] failed to bind to LDAP server <a href="ldaps://192.168.1.1/">ldaps://192.168.1.1/</a>: Can't contact LDAP server: Operation now in progress
Dec 19 11:39:37 clinton nslcd[1861]: [7b23c6] failed to bind to LDAP server <a href="ldaps://192.168.1.1/">ldaps://192.168.1.1/</a>: Can't contact LDAP server: Operation now in progress
Dec 19 11:39:37 clinton nslcd[1861]: [7b23c6] no available LDAP server found
Dec 19 11:39:37 clinton nslcd[1861]: [7b23c6] no available LDAP server found

この段階、authconfigでUSELDAPAUTHをyesにするだけでは通らず。調べるとどうやらred hat系はauthconfig-tuiというツールを利用する、とどこぞで言われてみた。autuconfig-tuiは対話式のコンフィグツールらしい。起動してそのままのオプションで次へ、OKと押していく。でもダメだ。

調べると /etc/nslcd.conf も書き換わっていた。いらない行をコメントアウト。最後にnslcdを再起動してうまく行けた!

shell> more /etc/nslcd.conf
ldap_version 3
TLS_REQCERT never
uri ldaps://192.168.84.67/ ldaps://192.168.84.68/
base dc=l3tp,dc=org
#ssl no   # この行が勝手に追加されてたのでコメントアウト
#tls_cacertdir /etc/openldap/cacerts # この行が勝手に追加されてたのでコメントアウト

shell> service nslcd restart

shell> id hogetan

uid=1001(hogetan) gid=1001(hogetan)

完璧。

Linuxでsudoをしたとき、環境変数を引き継げなかった

Linuxでsudoをしたとき、環境変数を引き継げなかった。

1. 状況

Debianを利用しているとき、Subversionを利用したい場面があった。そそくさとapt-getでsubversionのクライアントをインストールしようとしたんだけれどうまくいかない。エラーメッセージを見てみるとldconfigが見つからない、と言われている。

エラーの内容は以下の通り

shell> sudo apt-get install subversion
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libneon27-gnutls libserf-0-0 libsvn1
Suggested packages:
subversion-tools db4.8-util
The following NEW packages will be installed:
libneon27-gnutls libserf-0-0 libsvn1 subversion
0 upgraded, 4 newly installed, 0 to remove and 47 not upgraded.
Need to get 0 B/2,490 kB of archives.
After this operation, 7,152 kB of additional disk space will be used.
Do you want to continue [Y/n]? y
dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable.
dpkg: error: 2 expected programs not found in PATH or not executable.
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin.
E: Sub-process /usr/bin/dpkg returned an error code (2)

2. 解決

これを見る限りどうやらldconfigがPATHに含まれていないか実行権限がないよ、と言われている。試しに手元でldconfigを試してみるけれど確かに実行できない。
locateで場所を探すとldconfig自体は入っているようだ。となると恐らくsudoでapt-getしたとき、PATHが一般ユーザのままでapt-getが走ってて、そのせいでldconfigが見つからないんだろう、ということに。

通常、そのままsudoを利用すると環境変数などはsudoを実行したユーザの物を引き継ぐ。PWDとかの情報も一緒だ。今回のように-uでsudoの実行ユーザを変更していないのでsudoで実行される命令はrootのものになる。
sudoをしたときに新たにrootのPATHなどの環境変数をロードするようにしたい。
manを漁ると出てきた。

-i [command]
The -i (simulate initial login) option runs the shell
specified by the password database entry of the target user
as a login shell.  This means that login-specific resource
files such as .profile or .login will be read by the shell.
If a command is specified, it is passed to the shell for
execution via the shell's -c option.  If no command is
specified, an interactive shell is executed.  sudo attempts
to change to that user's home directory before running the
shell.  The security policy shall initialize the
environment to a minimal set of variables, similar to what
is present when a user logs in.  The Command Environment
section in the sudoers(5) manual documents how the -i
option affects the environment in which a command is run
when the sudoers policy is in use.

 

ということで sudo -iをしてインストールが完了。

loggerコマンドの使用例

syslogフォーマットでログを送信することのできるloggerコマンドの使用例。

loggerコマンドの使用例

shell> logger -h host.l2tp.org -p local0.info -t hoge
hogehoge ^D

-hでホストを指定

-pはプライオリティを指定。 ドット区切りでログファシリティとログレベルを指定

-tはタグ指定。プログラム名とも呼ばれる。

LinuxのOSの起動時にデーモンを自動で立てる方法。

[[email protected] ~]# /etc/rc.d/init.d/httpd start ← httpd起動
httpd を起動中: [ OK ]
[[email protected] ~]# chkconfig httpd on ← httpd自動起動設定

http://www.open.esys.tsukuba.ac.jp/wiki/?CentOS+%A5%B5%A1%BC%A5%D0%B9%BD%C3%DB%B5%AD%A1%A1by+yuto
ちなみに正体はランレベルごとにrc.dにシンボリックリンクをはってるらしい。

l2tp.org%chkconfig httpd on
failed to make symlink /etc/rc2.d/S85httpd: Permission denied
failed to make symlink /etc/rc3.d/S85httpd: Permission denied
failed to make symlink /etc/rc4.d/S85httpd: Permission denied
failed to make symlink /etc/rc5.d/S85httpd: Permission denied
l2tp.org%sudo chkconfig httpd on

ここに自動実行されるデーモンの起動スクリプトが格納されています。
「/etc/rc.d/rcランレベル.d」の形でフォルダに格納されていますので異なるランレベルの場合は読み替えてください。
ここに必要な起動スクリプトを格納します。
格納するスクリプトはデーモンの起動スクリプトが格納されている
「/etc/rc.d/init.d」フォルダの中のスクリプトのシンボリックリンクを置くようにします。
で、ファイルの命名規則ですが
1. S:スタートアップ時に起動するデーモン
K:シャットダウン時に終了させるデーモン
2. 優先順位
3. デーモン名
で命名します。
例えば「S55sshd」とすると
優先順位55番目でsshdを起動するということになります。

http://blog.veryposi.info/server/server-setup/centos-initd-rc/

CentOSでMySQLのクエリログをとりたい

FreeBSDだと起動スクリプトのオプションはrc.confで与えてやるんだけど、CentOSだとよくわかんない。
起動スクリプトに直接書くような雰囲気もあるけど、そこにオプション群はない。
あったのはbasedirとdatadirだけ。
で、my.cnfに書けばいいようなのを発見。

 2.MySQL設定ファイル mysqld セクションに設定を記述します。
[mysqld]
log=myquery.log

http://a-programmer.blog.so-net.ne.jp/2007-09-15

CentOS5.3でmysqlが立ち上がらない

エラーメッセージは起動スクリプトを実行したコンソールに

Manager of pid-file quit without updating fi

と出てくる。
ググったけどあまり良い結果は得られず。
そもそもこのメッセージ、起動スクリプトの/etc/rc.d/init.d/mysqlに入ってるもの。

# if manager isn’t running, then pid-file will never be updated
if test -n “$manager_pid”; then
if kill -0 “$manager_pid” 2>/dev/null; then
: # the manager still runs
else
# The manager may have exited between the last pid-file check and now. \
if test -n “$avoid_race_condition”; then
avoid_race_condition=””
continue # Check again.
fi
# there’s nothing that will affect the file.
log_failure_msg “Manager of pid-file quit without updating file.”
return 1 # not waiting any more.
fi
fi

なので環境依存とかでメッセージの内容が違うのかもしれない。だから見つからないのかな、と。
他の人ではユーザが違うのが原因だとか言ってたのでその線であたる。
mysqlがnologinになってたのでyp書き換えて無理やりログイン->mysqld_safeを手動で実行。するとちゃんと走ってる。
rootでmysqld_safeを実行、走ってる。
なんか様子が変だなぁと思い、ちょっと前に書き換えたmy.cnfをリポジトリから復元。
すると正常起動。
結局設定ファイルですか、って感じです。
hostname.errには何もエラーログが流れないので油断しました。
設定ファイルでひっかかったのは

max_allowed_packet = 1M
#max_allowed_packet = 1024M

の箇所。大きくしすぎるとだめなようです。
でも先に

innodb_buffer_pool_size = 2000M

を小さくしたのにこちらでは改善されず。
おそらく、max_allowed_packetの値*max_connectionsでメモリを確保しようとしてswapしまくりんぐ、swap足りねーってなって起動しなかったんではないかと予測。それならそうと/var/log/messagesにログが残っててもよさそうなんだけどそれは見当たらず。
mysqldが一人で困って周りに助けを求めんからいけん。
ログださんかったらなんもわからんわ!

CentOSでNFSを利用する

クライアント側の設定
以下の例ではNFSサーバのIPを192.168.10.1とし、サーバのディレクトリ /hogeをクライアントの/hoge1へマウントする場合.実際には適宜読みかえる.
オートマウントの設定。/etc/auto.masterに次のような行を追加する:
/misc /etc/auto.misc –timeout=60
数字は、その秒数アクセスがないと自動的にアンマウントするという意味。次に/etc/auto.miscに以下のような行を追加する:
hoge1 -fstype=nfs,rw 192.168.10.1:/hoge
好みの場所へリンクを張る:
# ln -s /misc/hoge1 /hoge1
autofsを起動するよう設定:
# /sbin/service autofs start
# /sbin/chkconfig autofs on
以上で、クライアントにおいて/hoge1にアクセスしたときに自動的にマウントされるようになる.
参照: http://www.geocities.jp/hoge_tomo/

http://tmcosmos.org/linux/centos/co4_server.html#NFS
実際には/etc/auto.miscへ

home -fstype=nfs,rw homenfs:/usr/home

を追加し、/etc/auto.masterに

/misc /etc/auto.misc –timeout=36000000

を追加する。
# mkdir /misc/home
# ln -s /misc/home /home