UNIX

2013年06月11日

LDAPサーバを構築したのでメモ

タイトルは、依頼主がLDAPのことをそう呼んでるから採用しました((

■要件

・社内で使ってるADの情報で認証したい
・けど、ADをグローバルに出すとか無いわー
・なのでProxyとして使えればOK
・( ゚ρ゚)
・ついでに独自のデータとかも格納出来れば、それはとっても嬉しいなって

■参考サイト

この辺り。とっても参考になりました。

CentOS6 をプログラミング環境として使う OpenLDAP環境構築

後、AD連携という点でこんな話もあるようで。(修正済みっぽい?)
OpenLDAPサーバを介してActiveDirectoryに接続する際の注意点ふたつメモ

slapd.confに書くやり方は結構出てきたのですが
OpenLDAP 2.4だとslapd.conf → 変換してslapd.d以下にファイル展開
みたいにする必要がある上に、そこの変換でコケてたから中々進めませんでした/(^o^)\

後これ。
slapo-translucent(5) - Linux man page

■設定内容

またまたはまっていたので要所だけメモ。
slapd.conf.obsoluteのbdb以降を消し、
後ろにdatabase ldap用の設定を追記した物で変換成功しましたヽ・w・ノ

#######################################################################
# database definitions
#######################################################################

database ldap
suffix "dc=example,dc=com"
rootdn "cn=administrator,cn=Users,dc=example,dc=com"

# Cleartext passwords, especially for the rootdn, should
# be avoided. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw secret
# rootpw {crypt}ijFYNcSNctBYg
rootpw password
uri ldap://example.com

access to * by * read

chase-referrals no
conn-ttl 15
idle-timeout 5
single-conn yes
acl-authcDN "cn=administrator,cn=Users,dc=example,dc=com"
acl-passwd password



中々繋がらなかったので
パケットキャプチャしてみた。

最初の2つが、backendにldapを使ってくれるかの確認で試したldapsearchで
それ以降は直接backendのADを指定してldapsearchした時のもの。



どうも、正規のアクセスと違って
bind_requestをやる前にsearchrequestを投げてるみたい・・・?

manのページをみて、認証に絡んでそうなところを片っ端から足して試行錯誤したのですが
rootdnrootpwはプロクシになるサーバを利用するための情報であって
BackendであるADを利用するための情報は
acl-authcDNacl-passwdで指定しないといけないようです。

同じ情報でやってくれるオプションがあるような気もしますが
ひとまず動いた段階でメモメモφ(・ワ・

nanodayo at 18:13コメント(0)トラックバック(0) 

2010年10月31日

Angel Beatsではありません。
Apache Benchmarkです。
そういえばAngel Beats2話以降見てないなぁ。まぁいい。

Apache Benchmarkということで
HTTPの性能試験に使うツールです。
Apacheをインストールすると合わせて入るらしいです。

使い方はこんな感じ。
# ab -n <リクエスト数> -c <同時接続数> <URL>

<URL>の部分は<host>/<path>でも指定できます。
ただ、その場合<path>の部分は必須のようです。
なんですが、実は<host>/とかでも良いようです。

結果はこんな感じ。
ab -n 1000 -c 100 172.16.1.1/ [~/work/nanodayo/perf/ab]
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.16.1.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: Apache/2.2.14
Server Hostname: 172.16.1.1
Server Port: 80

Document Path: /
Document Length: 177 bytes

Concurrency Level: 100
Time taken for tests: 2.964 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 454260 bytes
HTML transferred: 177885 bytes
Requests per second: 337.44 [#/sec] (mean)
Time per request: 296.353 [ms] (mean)
Time per request: 2.964 [ms] (mean, across all concurrent requests)
Transfer rate: 149.69 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 4 142 361.8 19 2029
Processing: 3 73 154.2 20 1209
Waiting: 3 54 119.7 20 883
Total: 19 215 391.6 40 2487

Percentage of the requests served within a certain time (ms)
50% 40
66% 45
75% 62
80% 323
90% 946
95% 1008
98% 1366
99% 2001
100% 2487 (longest request)


リクエスト数が151を超えると、
Completed 100 requests
のように進捗状況が出力されます。

他には認証やPOSTメソッドにも対応しているようですが
それはまた次回にでも。



nanodayo at 14:34コメント(0)トラックバック(0) 
最近、計測系ツールも調べています。
思えばこの手のツールをちゃんと使ったことがなかったです。

iperfはネットワークのパフォーマンスを測定するツールで
このプログラム一つでサーバにもクライアントにも出来ます。

サーバとして使う場合は
# iperf -s -p <待ち受けポート>

のように実行する。

クライアントとして実行する場合は
# iperf -c <サーバのアドレス> -p <サーバのポート> -t <測定時間>

のように実行します。
測定時間の単位は秒です。

なお、測定時間の代わりにデータのサイズを指定することも出来ます。
両方で指定した場合は後ろにつけた方が優先されるようです。
# iperf -c <サーバのアドレス> -p <サーバのポート> -n <データサイズ>

サイズを指定できます。何も付けないとByte単位、KでKByte、MでMByte単位になります。
指定自体は自由にできますが、8KByteの倍数に調整されるようです。
#defaultのバッファサイズが8KByteなため

他には-uでUDPになります。

出力結果はこんな感じ。
# iperf -c 127.0.0.1 -p 10000 -n 1M -u
------------------------------------------------------------
Client connecting to 127.0.0.1, UDP port 10000
Sending 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)
------------------------------------------------------------
[1828] local 127.0.0.1 port 4587 connected with 127.0.0.1 port 10000
[ ID] Interval Transfer Bandwidth
[1828] 0.0- 1.3 sec 167 KBytes 1.04 Mbits/sec
[1828] Server Report:
[1828] 0.0- 1.3 sec 167 KBytes 1.04 Mbits/sec 0.000 ms 0/ 116 (0%)
[1828] Sent 116 datagrams


また-iで途中経過を出力することができて、間隔を指定できます。
単位は秒単位です。0.5とかやると1秒より短く出来ますが
0.5秒が最小のようです。

# iperf -c 127.0.0.1 -p 10000 -n 1M -i 0.05 -u
WARNING: interval too small, increasing from 0.05 to 0.5 seconds.
------------------------------------------------------------
Client connecting to 127.0.0.1, UDP port 10000
Sending 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)
------------------------------------------------------------
[1828] local 127.0.0.1 port 4625 connected with 127.0.0.1 port 10000
[ ID] Interval Transfer Bandwidth
[1828] 0.0- 0.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 0.5- 1.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 1.0- 1.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 1.5- 2.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 2.0- 2.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 2.5- 3.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 3.0- 3.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 3.5- 4.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 4.0- 4.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 4.5- 5.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 5.0- 5.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 5.5- 6.0 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 6.0- 6.5 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 6.5- 7.0 sec 64.6 KBytes 1.06 Mbits/sec
[1828] 7.0- 7.5 sec 63.2 KBytes 1.03 Mbits/sec
[1828] 0.0- 8.0 sec 1.00 MBytes 1.05 Mbits/sec
[1828] Server Report:
[1828] 0.0- 8.0 sec 1.00 MBytes 1.05 Mbits/sec 0.000 ms 0/ 714 (0%)
[1828] Sent 714 datagrams


その他、バッファサイズなども指定できますが
今回は基本的な部分だけで。

結果を取り出して、グラフ用の値にする方法も考えていますが
第一段階としてはgrep secしておけば良さそうです。



nanodayo at 12:40コメント(6)トラックバック(0) 

2010年09月10日

タイトルの通りの変換を行うスクリプトを作ってみました。
#!/usr/bin/perl

$prefix = "fe80";
$mac_file = $ARGV[0];

open(MACLIST, "< $mac_file");
while($buf=<MACLIST>) {
@mactmp = split(/:/,$buf);
$j=0;
$addrtmp = hex($mactmp[$j++]) ^ 2;
$addr[0] = sprintf("%x%s",$addrtmp,$mactmp[$j++]);
$addr[1] = sprintf("%sff",$mactmp[($j++)]);
$addr[2] = sprintf("fe%s",$mactmp[($j++)]);
$addr[3] = sprintf("%s%s",$mactmp[($j++)],$mactmp[$j++]);

printf("$prefix::$addr[0]:$addr[1]:$addr[2]:$addr[3]",$addr[0]);
}

引数には、MACアドレスリストを書いたファイルを渡す必要があります。
用途的に、$jの部分は別にハードコードしても問題ないかと思います。
$prefixは将来的には指定できるようにして、
グローバルアドレスに対応させようと思っていたり。
そうなると::省略が真ん中とは限らなくなったり、そもそも省略がなかったりしますね。

ちなみに引数で渡すファイルの中身はこんな感じ。
1行ずつ書かれているのを想定しています。
空行があると変なアドレスを出力しちゃうと思います。
11:11:11:11:11:11
22:22:22:22:22:22

ところで何に使うんだろう



nanodayo at 17:11コメント(1)トラックバック(0) 

2010年09月05日

■前置き


サーバを10台とか100台とか管理している状況を想像してみてください。

その10台に全く同じファイルをコピーしたいとか
全く同じコマンドを実行させたいとか
同じ操作をしたくなる状況は多々あると思います。
普通にsshで1台1台にログインして操作すればいいのですが
数が多くなると面倒なので、なんとかスクリプトを組みたいと思うものです。
流石に100回も同じパスワードを打ちたくないですし。

■既存の手法


公開鍵を各サーバに登録してしまえば
自作スクリプトなり、psshなり、codeployなり、選択肢はあれこれありますが
ここでは鍵を登録していない状況で操作するための方法を考えます。

■expectを使った方法


サーバ側に特に準備をしない方法として
expectを使う手があります。
こんな感じのスクリプトを作ります。
ちなみに操作するPC側にはexpectをインストールする必要があります。

#!/usr/local/bin/bash

expect -c "
set timeout 5
spawn ssh $1
expect rsa:
send \r
expect password:
send $2\r
interact
"


# シングルクオートは単なる文字として見なされるようです

expectは対話的な操作を実行するプログラムです。
spawn hogeでhogeを実行し、
expect "hoge"で、hogeという出力を読み、send "hoge\r" でhogeを入力します。
expect 'password:'みたいにやれば、パスワードの入力を求められた時に、
次のsendでパスワードを入力することができるわけです。

通常は1行目は
#!/usr/local/bin/expect にするらしいですが、
bashを経由して expect -c "中身" のようにすることによって
$1を引数として渡せるらしいです。

このスクリプトをexsshなんて名前にして
# exssh user@server password

のようにそれぞれ指定して実行すれば、勝手にログインしてくれます。
$3で、実行させたいコマンドを指定できるように改造してもいいでしょう。

あるいは
# exssh "user@server reboot" password

のように、$1の一部としてコマンドを指定する手もあります。

nanodayo at 03:57コメント(3)トラックバック(0)