2014年4月27日日曜日

OpenLDAPのログ出力設定


■Linux SSHログイン認証をOpenLDAPで一元管理

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで実現するための流れを、下記のパートに分けて記載していきます。



■本編の概要
OpenLDAPサーバはデフォルト設定ではログを出力しません。
slapd.confにログレベルを記述すると、シスログ経由でログを出力します。
ログレベルおよびログの出力先の設定についての手順を記載します。

OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■標準のログレベルだと出力量が多すぎるので変更
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# grep -A 5  "EVERYTHING" /etc/openldap/slapd.conf
# rootdn can always read and write EVERYTHING!

# LogLevel
loglevel 512

# change own password ---- from ----
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※loglevelのデフォルト値は256です。詳細については他のサイトを参照ください。
※change_slapd.shは「OpenLDAPのインストールと起動」 で作成したスクリプトです。

■rsysylogにOpenLDAPのログ出力設定
openldap-servers、openldap-clients、nss-pam-ldapd を追加インストール
[root@ty-ldap01 ~]# echo "local4.*    /var/log/ldap.log" > /etc/rsyslog.d/ldaplog.conf
[root@ty-ldap01 ~]# cat /etc/rsyslog.d/ldaplog.conf
local4.*    /var/log/ldap.log
[root@ty-ldap01 ~]# /etc/init.d/rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]
[root@ty-ldap01 ~]#

■OpenLDAP登録ユーザでログインしたときのログ
## アプリ系サーバの操作
[root@ty-app01 ~]# su - user1001
-bash-4.1$ su - user1002
パスワード:
-bash-4.1$

## その時のLDAPサーバのログ
[root@ty-ldap01 ~]# tail -f /var/log/ldap.log

Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1000 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1001 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1002 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1003 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: <= bdb_equality_candidates: (uniqueMember) not indexed
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1004 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1000 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1001 op=2 ENTRY dn="cn=team1000,ou=group,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1002 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1003 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1004 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1001 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1005 op=1 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=4 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1004 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1000 op=5 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1001 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=5 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1004 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: <= bdb_equality_candidates: (uniqueMember) not indexed
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1000 op=6 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1001 op=5 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=5 ENTRY dn="cn=team1000,ou=group,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=6 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
デフォルトのloglevelから一つ下げましたが、別ユーザにスイッチするだけで上記のログが出力されます。

以上で終了です。長文おつきあいありがとうございます。サイト継続ご協力のほどお願い申し上げます。m(_ _)m


Before << (3) LDAP登録ユーザでのSSHログイン認証とパスワード変更

2014年4月26日土曜日

LDAP登録ユーザでのSSHログイン認証とパスワード変更


■Linux SSHログイン認証をOpenLDAPで一元管理

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで実現するための流れを、下記のパートに分けて記載していきます。



■本編の概要
アプリ系サーバにLDAP認証モジュール(nss-pam-ldapd)を追加してLDAPサーバに接続します。 idコマンドでLDAPに登録したユーザを確認できるものの、ログインすることができません。 認証クライアントモジュールをsssdからnslcdに変更にすることで、SSHログインできるようになります。 homeDirectoryもLDAPサーバからNFSマウントする方式にした方が一元管理レベル感が高まります。 ここまで出来ればLDAPユーザのパスワードをアプリ系サーバから変更したいところですが、 またしてもエラーに出くわします。slapd.confをさらに修正することでLDAPサーバ上の パスワードも変更できるようなります。こちらの手順もまとめます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■アプリ系サーバにnss-pam-ldapdのインストール
[root@ty-app01 ~]# yum install nss-pam-ldapd.x86_64
(中略)
============================================================================
 Package                Arch        Version               Repository   Size
============================================================================
Installing:
 nss-pam-ldapd          x86_64      0.7.5-18.2.el6_4      base        152 k
Installing for dependencies:
 nscd                   x86_64      2.12-1.132.el6        base        219 k
 pam_ldap               x86_64      185-11.el6            base         88 k

Transaction Summary
============================================================================
Install       3 Package(s)
(以下略)

■authconfig-tuiによるクライアント側認証モジュール設定
authconfig-tuiのGUIの表示が崩れないように言語を英語に変更しておきます。
[root@ty-app01 ~]# LANG=C; authconfig-tui


↑Use LDAP にチェック。あとはデフォルトのまま。

↑ServerとBaseDNを設定。
[root@ty-app01 ~]# LANG=C; authconfig-tui
nslcd を起動中:                                            [  OK  ]
[root@ty-app01 ~]#
※sssdが自動起動される場合があります。
sssdの認証処理はTLSまたはLDAPSプロトコルが必須となり設定が複雑なので今回はnslcdを利用します。

## LANGを元に戻す
[root@ty-app01 ~]# LANG=ja_JP.UTF-8
## authconfig-tuiによりldap.confが修正されたことを確認
[root@ty-app01 ~]# grep -v "#\|^$" /etc/openldap/ldap.conf
TLS_CACERTDIR /etc/openldap/cacerts
URI ldap://ty-ldap01/
BASE dc=open_ldap,dc=com
[root@ty-app01 ~]#
## LDAPサーバ上のユーザ確認
[root@ty-app01 ~]# grep user1001 /etc/passwd
[root@ty-app01 ~]# id user1001
uid=1001(user1001) gid=1000(LDAP team1000) 所属グループ=1000(LDAP team1000)
[root@ty-app01 ~]#

■ホームディレクトリ準備
[root@ty-app01 ~]# mount -t nfs ty-ldap01:/home /home
[root@ty-app01 ~]# mkdir -m 700 /home/user1001; chown user1001: /home/user1001
[root@ty-app01 ~]# mkdir -m 700 /home/user1002; chown user1002: /home/user1002
[root@ty-app01 ~]# mkdir -m 700 /home/user2001; chown user2001: /home/user2001
[root@ty-app01 ~]# mkdir -m 700 /home/user2002; chown user2002: /home/user2002

■OpenLDAPサーバ上のユーザにスイッチ
[root@ty-app01 ~]# su - user1001
-bash-4.1$ su - user1002
パスワード:
su: パスワードが違います
-bash-4.1$
rootユーザからのスイッチはパスワードを聞かれないので可能ですが、
user1001 → user1002のスイッチ時に正しいパスワードを入力しても認証されません・・・。(T-T)

■認証クライアントモジュールの修正
[root@ty-app01 ~]# cd /etc/pam.d/
[root@ty-app01 pam.d]# ll | grep auth-ac
lrwxrwxrwx. 1 root root  19  3月 21 15:35 2014 fingerprint-auth -> fingerprint-auth-ac
-rw-r--r--. 1 root root 659  3月 21 15:35 2014 fingerprint-auth-ac
lrwxrwxrwx. 1 root root  16  3月 21 15:35 2014 password-auth -> password-auth-ac
-rw-r--r--. 1 root root 896  3月 21 15:35 2014 password-auth-ac
lrwxrwxrwx. 1 root root  17  3月 21 15:35 2014 smartcard-auth -> smartcard-auth-ac
-rw-r--r--. 1 root root 711  3月 21 15:35 2014 smartcard-auth-ac
lrwxrwxrwx. 1 root root  14  3月 21 15:35 2014 system-auth -> system-auth-ac
-rw-r--r--. 1 root root 937  3月 21 15:35 2014 system-auth-ac
[root@ty-app01 pam.d]#
## system-auth-acを修正
[root@ty-app01 pam.d]# cp -p system-auth-ac system-auth-ac.20140321
[root@ty-app01 pam.d]# vi system-auth-ac
[root@ty-app01 pam.d]# diff system-auth-ac system-auth-ac.20140321
7d6
< auth        sufficient    pam_ldap.so use_first_pass
15d13
< account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
19d16
< password    sufficient    pam_ldap.so use_authtok
23d19
< session     optional      pam_ldap.so
[root@ty-app01 pam.d]#
⇒適所に上記4レコードを追加。
※[pam_sss]になっている場合は[pam_ldap]に変更。

## OpenLDAPサーバ上のユーザにスイッチ
[root@ty-app01 pam.d]# /etc/init.d/nslcd restart
nslcd を停止中:                                            [  OK  ]
nslcd を起動中:                                            [  OK  ]
[root@ty-app01 pam.d]# su - user1001
-bash-4.1$ su - user1002
パスワード:
-bash-4.1$ id
uid=1002(user1002) gid=1000(LDAP team1000) 所属グループ=1000(LDAP team1000)
-bash-4.1$
成功!! (^o^)

## OpenLDAPサーバ上のユーザのパスワード変更
-bash-4.1$ passwd
ユーザー user1002 のパスワードを変更。
Enter login(LDAP) password:
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information update failed: Insufficient access
passwd: 認証トークン操作エラー
-bash-4.1$
認証されるようになったが、パスワードの変更は失敗する・・・。(T-T)


■LDAPサーバ側でパスワード変更権限追加設定
※LDAPサーバ側の設定です!!
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# grep -A 20 "EVERYTHING" /etc/openldap/slapd.conf
# rootdn can always read and write EVERYTHING!

# change own password ---- from ----
access to attrs=userPassword
        by self write
        by dn="cn=Manager,dc=open_ldap,dc=com" write
        by anonymous auth
        by * none
access to *
        by self write
        by * read
# change own password ----- to -----

# enable on-the-fly configuration (cn=config)
database config
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
        by * none

# enable server status monitoring (cn=monitor)
database monitor
[root@ty-ldap01 ~]#
※ # change own password のくだりを追加する場所が大事です。

## 設定反映
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※change_slapd.shは (1) OpenLDAPのインストールと起動 で作成したスクリプトです。


■OpenLDAPサーバ上のユーザのパスワード変更
[root@ty-app01 ~]# su - user1001
-bash-4.1$ passwd
ユーザー user1001 のパスワードを変更。
Enter login(LDAP) password:
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information changed for user1001
passwd: 全ての認証トークンが正しく更新できました。
-bash-4.1$
成功!! (^o^)

## 念のため確認
[root@ty-app01 ~]# ldapsearch -x -h ty-ldap01 -D "cn=Manager,dc=open_ldap,dc=com" -w secret | grep -n userPassword
58:userPassword:: e2NyeXB0fSQxJEJTZGhaSm1hJEF0cjE1d3dGa1pLN1FNeHFOeVA5MC8=
67:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
80:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
93:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
[root@ty-app01 ~]#
user1001のパスワードのエンコード文字列だけ変更となっています。

## パスワードのエンコード方式の確認
[root@ty-app01 ~]# echo "e2NyeXB0fSQxJEJTZGhaSm1hJEF0cjE1d3dGa1pLN1FNeHFOeVA5MC8=" | base64 -d
{crypt}$1$BSdhZJma$Atr15wwFkZK7QMxqNyP90/[root@ty-app01 ~]#
SSHAではなく、cryptでエンコードされているようです。

## うまくいかない場合
下記ファイルの設定も見直してください。
/etc/pam.d/password-auth-ac
/etc/nsswitch.conf



Before << (2) LDIFによるLDAPサーバへのデータ登録
Next >> (4) OpenLDAPのログ出力設定

2014年4月25日金曜日

LDIFによるLDAPサーバへのデータ登録


■Linux SSHログイン認証をOpenLDAPで一元管理

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで実現するための流れを、下記のパートに分けて記載していきます。



■本編の概要
LinuxのOSユーザは最低1つのグループに属しているので、それを踏襲したDIT(Directory Information Tree)を LDAP上に定義して、ユーザを登録する手順をまとめます。 LDAPサーバへデータを登録するにはLDIFファイルの利用が便利です。 登録したユーザの削除やパスワード変更、一連作業時によくあるエラーのメッセージもまとめてみます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■DIT(Directory Information Tree)概念図
●dc=open_ldap,dc=com
│
├---●ou=Group
│   │
│   ├---●cn=team1000
│   └---●cn=team2000
│
└---●ou=People
     │
     ├---●uid=user1001
     ├---●uid=user1002
     ├---●uid=user2001
     └---●uid=user2002

■オブジェクトクラスの確認
OSユーザに必要な属性をカバーする適当なオブジェクトクラスとして'posixAccount'を使用する。
スキーマに定義されている内容を確認する。
[root@ty-ldap01 ~]# grep -n -A 4 posixAccount /etc/openldap/schema/*.schema
/etc/openldap/schema/nis.schema:161:objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
/etc/openldap/schema/nis.schema-162-    DESC 'Abstraction of an account with POSIX attributes'
/etc/openldap/schema/nis.schema-163-    SUP top AUXILIARY
/etc/openldap/schema/nis.schema-164-    MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
/etc/openldap/schema/nis.schema-165-    MAY ( userPassword $ loginShell $ gecos $ description ) )
[root@ty-ldap01 ~]#
⇒homeDirectory が必須属性になっていることに注意!!

■LDIFファイル準備
## base.ldif
[root@ty-ldap01 ldif]# cat base.ldif
dn: dc=open_ldap,dc=com
objectClass: dcObject
objectClass: organization
dc: open_ldap
o: OpenLDAP Corporation

dn: cn=Manager,dc=open_ldap,dc=com
objectclass: organizationalRole
cn: Manager

dn: ou=Group,dc=open_ldap,dc=com
objectClass: organizationalUnit
ou: Group

dn: ou=People,dc=open_ldap,dc=com
objectClass: organizationalUnit
ou: People
[root@ty-ldap01 ldif]#
## group.ldif
[root@ty-ldap01 ldif]# cat group.ldif
dn: cn=team1000,ou=group,dc=open_ldap,dc=com
objectClass: posixGroup
objectClass: top
cn: LDAP team1000
gidNumber: 1000

dn: cn=team2000,ou=group,dc=open_ldap,dc=com
objectClass: posixGroup
objectClass: top
cn: LDAP team2000
gidNumber: 2000
[root@ty-ldap01 ldif]#
## people.ldif
[root@ty-ldap01 ldif]# cat people.ldif
dn: uid=user1001,ou=People,dc=open_ldap,dc=com
uid: user1001
cn: LDAP user1001
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/user1001

dn: uid=user1002,ou=People,dc=open_ldap,dc=com
uid: user1002
cn: LDAP user1002
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/user1002

dn: uid=user2001,ou=People,dc=open_ldap,dc=com
uid: user2001
cn: LDAP user2001
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 2001
gidNumber: 2000
homeDirectory: /home/user2001

dn: uid=user2002,ou=People,dc=open_ldap,dc=com
uid: user2002
cn: LDAP user2002
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 2002
gidNumber: 2000
homeDirectory: /home/user2002
[root@ty-ldap01 ldif]#
※userPasswordには (1) OpenLDAPのインストールと起動 で作成した各ユーザ(共通)のエンコードされたパスワード文字列を指定。

■データ登録
## base.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./base.ldif
adding new entry "dc=open_ldap,dc=com"

adding new entry "cn=Manager,dc=open_ldap,dc=com"

adding new entry "ou=Group,dc=open_ldap,dc=com"

adding new entry "ou=People,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
## group.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./group.ldif
adding new entry "cn=team1000,ou=group,dc=open_ldap,dc=com"

adding new entry "cn=team2000,ou=group,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
## people.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./people.ldif
adding new entry "uid=user1001,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user1002,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user2001,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user2002,ou=People,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
★LDIFに'homeDirectory'の記載を忘れたときのエラー
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f people-nohome.ldif
adding new entry "uid=user2003,ou=People,dc=open_ldap,dc=com"
ldap_add: Object class violation (65)
        additional info: object class 'posixAccount' requires attribute 'homeDirectory'

[root@ty-ldap01 ldif]#
★ユーザを重複登録したときのエラー
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f people-dual.ldif
adding new entry "uid=user2001,ou=People,dc=open_ldap,dc=com"
ldap_add: Already exists (68)

[root@ty-ldap01 ldif]#

■ldap.confの修正
[root@ty-ldap01 ~]# cp -p /etc/openldap/ldap.conf /etc/openldap/ldap.conf.org
[root@ty-ldap01 ~]# vi /etc/openldap/ldap.conf
[root@ty-ldap01 ~]# grep -v "#\|^$" /etc/openldap/ldap.conf
TLS_CACERTDIR   /etc/openldap/certs
URI ldap://127.0.0.1/
BASE dc=open_ldap,dc=com
[root@ty-ldap01 ~]#
※上記の修正を怠ると、ldapsearchコマンドでエントリがヒットしない場合がある。

■登録した情報を確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -D "cn=Manager,dc=open_ldap,dc=com" -w secret | grep -n dn:
10:dn: dc=open_ldap,dc=com
17:dn: cn=Manager,dc=open_ldap,dc=com
22:dn: ou=Group,dc=open_ldap,dc=com
27:dn: ou=People,dc=open_ldap,dc=com
32:dn: cn=team1000,ou=group,dc=open_ldap,dc=com
40:dn: cn=team2000,ou=group,dc=open_ldap,dc=com
48:dn: uid=user1001,ou=People,dc=open_ldap,dc=com
61:dn: uid=user1002,ou=People,dc=open_ldap,dc=com
74:dn: uid=user2001,ou=People,dc=open_ldap,dc=com
87:dn: uid=user2002,ou=People,dc=open_ldap,dc=com
[root@ty-ldap01 ~]# 

■特定ユーザのパスワード変更
[root@ty-ldap01 ~]# ldappasswd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -s himitsu "uid=user1001,ou=People,dc=open_ldap,dc=com"
パスワードをプロンプトから入力する場合は[-s naisyo] → [-S]にする。

## パスワードが変更されたかの確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b "uid=user1001,ou=People,dc=open_ldap,dc=com" -LLL
dn: uid=user1001,ou=People,dc=open_ldap,dc=com
uid: user1001
cn: LDAP user1001
objectClass: account
objectClass: posixAccount
objectClass: top
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/user1001
userPassword:: e1NTSEF9WC9RTTFzVzhTSEpIYTdURUN1TENsRVpWMEhwbHIyVHQ=

[root@ty-ldap01 ~]#
## パスワードはbase64でエンコードされているのでデコード
[root@ty-ldap01 ~]# echo "e1NTSEF9WC9RTTFzVzhTSEpIYTdURUN1TENsRVpWMEhwbHIyVHQ=" | base64 -d
{SSHA}X/QM1sW8SHJHa7TECuLClEZV0Hplr2Tt[root@ty-ldap01 ~]#
⇒people.ldifに設定したパスワードは「{SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5」だったので確かに変更されているようです。

■特定ユーザエントリを削除
[root@ty-ldap01 ~]# ldapdelete -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret "uid=user2002,ou=People,dc=open_ldap,dc=com"
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b "dc=open_ldap,dc=com" | grep -n "dn: uid"
48:dn: uid=user1001,ou=People,dc=open_ldap,dc=com
61:dn: uid=user1002,ou=People,dc=open_ldap,dc=com
74:dn: uid=user2001,ou=People,dc=open_ldap,dc=com
[root@ty-ldap01 ~]#

■登録したデータを全削除する場合
[root@ty-ldap01 ~]# rm -rf /var/lib/ldap/*
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@ty-ldap01 ~]# /etc/init.d/slapd restart
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※以降の作業のために、全削除後もう一度ldifファイルでデータを登録しておきます。

■ホームディレクトリをNFSで公開
[root@ty-ldap01 ~]# vi /etc/exports
[root@ty-ldap01 ~]# cat /etc/exports
/home           *(rw,sync,no_root_squash)
[root@ty-ldap01 ~]# exportfs -a
[root@ty-ldap01 ~]# /etc/init.d/nfs start
NFS サービスを起動中:                                      [  OK  ]
NFS クォータを起動中:                                      [  OK  ]
NFS mountd を起動中:                                      [  OK  ]
NFS デーモンを起動中:                                      [  OK  ]
RPC idmapd を起動中:                                      [  OK  ]
[root@ty-ldap01 ~]#
## NFS自動起動設定
[root@ty-ldap01 ~]# chkconfig nfs on; chkconfig --list nfs
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@ty-ldap01 ~]#


LDIFによるLDAPサーバへのデータ登録の手順は以上で終了です。
次回はいよいよアプリ系サーバからOpenLDAP上に登録したユーザでSSHログインを行います。


Before << (1) OpenLDAPのインストールと起動
Next >> (3) LDAP登録ユーザでのSSHログイン認証とパスワード変更

2014年4月24日木曜日

OpenLDAPのインストールと起動


■Linux SSHログイン認証をOpenLDAPで一元管理

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで実現するための流れを、下記のパートに分けて記載していきます。



■本編の概要
openldap-servers、openldap-clients、nss-pam-ldapdのインストールおよびslapd.confの 設定と変更方法、slapdサービスの起動およびLDAPサーバへの接続確認方法についてまとめます。 特に、CentOS 6系からslapdの設定はslapd.dディレクトリ以下のファイルで定義される方式に変更と なっているので注意が必要です。今回はDB_CONFIGを使用し、旧来のslapd.confに設定した内容を slapd.dディレクトリに出力する手順をまとめます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■インストール済みOpenLDAP関連パッケージの確認
[root@ty-ldap01 ~]# yum list installed '*ldap*'
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
apr-util-ldap.x86_64 1.3.9-3.el6_0.1    @anaconda-CentOS-201311272149.x86_64/6.5
openldap.x86_64      2.4.23-32.el6_4.1  @anaconda-CentOS-201311272149.x86_64/6.5
python-ldap.x86_64   2.3.10-1.el6       @anaconda-CentOS-201311272149.x86_64/6.5
[root@ty-ldap01 ~]#

■最低限必要なパッケージのインストール
openldap-servers、openldap-clients、nss-pam-ldapd を追加インストール
[root@ty-ldap01 ~]# yum install openldap-clients.x86_64 openldap-servers.x86_64 nss-pam-ldapd.x86_64
(中略)
===========================================================================
 Package                  Arch      Version             Repository    Size
===========================================================================
Installing:
 nss-pam-ldapd            x86_64    0.7.5-18.2.el6_4    base         152 k
 openldap-clients         x86_64    2.4.23-34.el6_5.1   updates      165 k
 openldap-servers         x86_64    2.4.23-34.el6_5.1   updates      2.0 M
Installing for dependencies:
 nscd                     x86_64    2.12-1.132.el6      base         219 k
 pam_ldap                 x86_64    185-11.el6          base          88 k
Updating for dependencies:
 openldap                 x86_64    2.4.23-34.el6_5.1   updates      265 k

Transaction Summary
===========================================================================
Install       5 Package(s)
Upgrade       1 Package(s)
(以下略)

■インストール済みOpenLDAP関連パッケージの再確認
[root@ty-ldap01 ~]# yum list installed '*ldap*'
(中略)
Installed Packages
apr-util-ldap.x86_64      1.3.9-3.el6_0.1     @anaconda-CentOS-201311272149.x86_64/6.5
nss-pam-ldapd.x86_64      0.7.5-18.2.el6_4    @base
openldap.x86_64           2.4.23-34.el6_5.1   @updates
openldap-clients.x86_64   2.4.23-34.el6_5.1   @updates
openldap-servers.x86_64   2.4.23-34.el6_5.1   @updates
pam_ldap.x86_64           185-11.el6          @base
python-ldap.x86_64        2.3.10-1.el6        @anaconda-CentOS-201311272149.x86_64/6.5
[root@ty-ldap01 ~]#

■DB_CONFIG準備
DB_CONFIGファイルは、OpenLDAPサーバが BerkeleyDB をドライブする際の環境定義を書いておくファイルであり、 slapd.confのdirectoryディレクティブで指定したディレクトリから探されます。
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

■slapd設定を変換
OpenLDAPサービスに必要となる設定がCentOS 6で変更になっています。 旧バージョンでは、slapdは /etc/openldap/slapd.conf から設定していました。 RedHatEnterpriseLinux 6のslapd設定は特殊なLDAPディレクトリ(/etc/openldap/slapd.d/) 内の事前定義済みのスキーマとDIT(ディレクトリ情報ツリー)と共に格納されるようになりました。 旧来の設定ファイルを新しいディレクトリで機能するように変換する方法を記述します。

## slapd.confの準備
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
## slapd.confのチェック
[root@ty-ldap01 ~]# slaptest -u -f /etc/openldap/slapd.conf
config file testing succeeded
[root@ty-ldap01 ~]#
## 新しいディレクトリの /etc/openldap/slapd.d/ の内容を削除
[root@ty-ldap01 ~]# rm -rf /etc/openldap/slapd.d/*
## slaptestを実行して設定ファイルの有効性をチェックし、新しい設定ディレクトリを指定
[root@ty-ldap01 ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
bdb_db_open: database "dc=my-domain,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
backend_startup_one (type=bdb, suffix="dc=my-domain,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
[root@ty-ldap01 ~]#
## 新しいディレクトリ上でパーミッションを設定
[root@ty-ldap01 ~]# chmod -R 000 /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chmod -R u+rwX /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chown -R ldap: /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chown -R ldap: /var/lib/ldap

■LDAPサーバの起動
[root@ty-ldap01 ~]# /etc/init.d/slapd start
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
## 自動起動設定
[root@ty-ldap01 ~]# chkconfig slapd on; chkconfig --list slapd
slapd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@ty-ldap01 ~]#

■LDAPサーバへの接続確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b dc=my-domain,dc=com -LLL
No such object (32)
[root@ty-ldap01 ~]#
## オプション説明
"-x" 匿名ユーザーでの簡易認証
"-h" OpenLDAPサーバを指定
"-b" ディレクトリツリーの検索ベースを指定
"-LLL"最もシンプルなLDIFフォーマットへ出力を整形

## 結果補足
起動したばかりのOpenLDAPサーバからは、「検索条件に一致する結果はなし」との応答が返ります。
現時点ではまだエントリを登録していないため、これが正しい結果です。

■LDAPパスワードの作成
## 管理用
[root@ty-ldap01 ~]# slappasswd -s secret
{SSHA}XZY46aVGlCElS13dN4ryN0kwglZCVKqG
[root@ty-ldap01 ~]#
## 各ユーザ用(共通)
[root@ty-ldap01 ~]# slappasswd -s naisyo
{SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
[root@ty-ldap01 ~]#

■slapd.confの設定とチェック
[root@ty-ldap01 ~]# cp -p /etc/openldap/slapd.conf /etc/openldap/slapd.conf.org
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# egrep -n "^suffix|^rootdn|^rootpw" /etc/openldap/slapd.conf
115:suffix              "dc=open_ldap,dc=com"
117:rootdn              "cn=Manager,dc=open_ldap,dc=com"
123:rootpw              {SSHA}XZY46aVGlCElS13dN4ryN0kwglZCVKqG
[root@ty-ldap01 ~]# slaptest -u -f /etc/openldap/slapd.conf
config file testing succeeded
[root@ty-ldap01 ~]#
※rootpwには先ほど作成した管理者用のエンコードされたパスワード文字列を記述します。
※my-domain → open_ldap に変更してみました。

■slapd.confの設定変更反映
一連の作業をシェルスクリプト化しておきます。
[root@ty-ldap01 ~]# vi /usr/local/bin/change_slapd.sh
[root@ty-ldap01 ~]# cat /usr/local/bin/change_slapd.sh
#!/bin/sh
# /etc/openldap/slapd.conf の設定を反映するスクリプト

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chmod -R 000 /etc/openldap/slapd.d
chmod -R u+rwX /etc/openldap/slapd.d
chown -R ldap: /etc/openldap/slapd.d
/etc/init.d/slapd restart

exit 0
[root@ty-ldap01 ~]# chmod 755 /usr/local/bin/change_slapd.sh
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
slaptestコマンドでslapd.confの内容に基づきslapd.dディレクトリ以下にファイルを 出力したいが書き込み権限が無いため更新されません。よって事前に削除しておきます。

■管理者で接続確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -D "cn=Manager,dc=open_ldap,dc=com" -w secret
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
[root@ty-ldap01 ~]#
正しく接続できました。登録されたデータはまだないため上記のように表示されます。 OpenLDAPのインストールおよび起動、接続までの手順は以上となります。


Next >> (2) LDIFによるLDAPサーバへのデータ登録

2014年4月23日水曜日

Linux SSHログイン認証をOpenLDAPで一元管理


■概要
複数のユーザが複数のサーバにSSHでログインして作業する場合、各サーバごとにID/Passwordを準備して認証することも可能ですが、アカウント管理としては煩雑になっていしまいます。
LDAPサーバを導入してユーザのID/Passwordを一元管理することで、どのサーバにも同じPasswrodでログインでき、また、どこかのサーバでPasswordを変更しても他のサーバにログインする場合は変更後のPasswordでログインできるようになります。

OS: CentOS 6.4 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5



■LinuxOSへのSSHログイン認証を一元管理するまでの流れ

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで
実現するための流れを、下記のパートに分けて記載していきます。

(1) OpenLDAPのインストールと起動 (⇒詳細ページ)
openldap-servers、openldap-clients、nss-pam-ldapdのインストールおよびslapd.confの
設定と変更方法、slapdサービスの起動およびLDAPサーバへの接続確認方法についてまとめます。
特に、CentOS 6系からslapdの設定はslapd.dディレクトリ以下のファイルで定義される方式に変更と
なっているので注意が必要です。今回はDB_CONFIGを使用し、旧来のslapd.confに設定した内容を
slapd.dディレクトリに出力する手順をまとめます。

(2) LDIFによるLDAPサーバへのデータ登録 (⇒詳細ページ)
LinuxのOSユーザは最低1つのグループに属しているので、それを踏襲したDIT
(Directory Information Tree)をLDAP上に定義して、ユーザを登録する手順をまとめます。
LDAPサーバへデータを登録するにはLDIFファイルの利用が便利です。登録したユーザの削除や
パスワード変更、一連作業時によくあるエラーのメッセージもまとめてみます。

(3) LDAP登録ユーザでのSSHログイン認証とパスワード変更 (⇒詳細ページ)
アプリ系サーバにLDAP認証モジュール(nss-pam-ldapd)を追加してLDAPサーバに接続します。
idコマンドでLDAPに登録したユーザを確認できるものの、ログインすることができません。
認証クライアントモジュールをsssdからnslcdに変更にすることで、SSHログインできるようになります。
homeDirectoryもLDAPサーバからNFSマウントする方式にした方が一元管理レベル感が高まります。

ここまで出来ればLDAPユーザのパスワードをアプリ系サーバから変更したいところですが、またしても
エラーに出くわします。slapd.confをさらに修正することでLDAPサーバ上のパスワードも変更できる
ようなります。こちらの手順もまとめてみたいと思います。

(4) OpenLDAPのログ出力設定 (⇒詳細ページ)
OpenLDAPサーバはデフォルト設定ではログを出力しません。
slapd.confにログレベルを記述すると、シスログ経由でログを出力します。
ログレベルおよびログの出力先の設定についての手順を記載します。

概要へ戻る

2014年4月9日水曜日

CentOS 6.5 OpenSSLの脆弱性対応手順

OpenSSL(オープンソースのSSL/TLS暗号化ライブラリ)のバージョン1.0.1/1.0.2系に、
秘密鍵などの漏えいにつながる恐れのある深刻な脆弱性(CVE-2014-0160)が2014年4月7日
(米国時間)に発見されたそうです。

CentOS6.5のインストールメディアに入っているOpenSSLのバージョンは確か1.0.1だったよ
うな・・・。さっそく確認すると見事にビンゴ!ほったらかすとSSLサーバー証明書の秘密鍵、
そしてユーザー名やパスワード、あるいはメールや重要な文書など、暗号化しているはずの
コンテンツが盗み出されてしまう可能性が・・・。((((;゜Д゜)))

ってことで対応手順をまとめてみます。
まぁうちのサーバにそんな重要な情報ありませんが。なにか。

OS: CentOS 6.5(64-bit)
OpenSSL: 1.0.1e-15.el6 → 1.0.1e-16.el6_5.7


■OpenSSLのバージョン確認
[root@centos65 ~]# rpm -q openssl
openssl-1.0.1e-15.el6.x86_64
[root@centos65 ~]#
Codenomiconが公開(http://heartbleed.com/)した詳細バージョンを確認してみる。
※上記サイトの一部抜粋

How about operating systems?

Some operating system distributions that have shipped with potentially vulnerable OpenSSL version:

  • Debian Wheezy (stable), OpenSSL 1.0.1e-2+deb7u4
  • Ubuntu 12.04.4 LTS, OpenSSL 1.0.1-4ubuntu5.11
  • CentOS 6.5, OpenSSL 1.0.1e-15
  • Fedora 18, OpenSSL 1.0.1e-4
  • OpenBSD 5.3 (OpenSSL 1.0.1c 10 May 2012) and 5.4 (OpenSSL 1.0.1c 10 May 2012)
  • FreeBSD 10.0 - OpenSSL 1.0.1e 11 Feb 2013
  • NetBSD 5.0.2 (OpenSSL 1.0.1e)
  • OpenSUSE 12.2 (OpenSSL 1.0.1c)
やっぱり完全アウトです…。(T-T)

■OpenSSLのアップデート
[root@centos65 ~]# yum update openssl
(中略)
============================================================================
 Package             Arch         Version              Repository     Size
============================================================================
Updating:
 openssl             x86_64      1.0.1e-16.el6_5.7     updates       1.5 M
Updating for dependencies:
 openssl-devel       x86_64      1.0.1e-16.el6_5.7     updates       1.2 M

Transaction Summary
============================================================================
Upgrade       2 Package(s)
(中略)
Updated:
  openssl.x86_64 0:1.0.1e-16.el6_5.7

Dependency Updated:
  openssl-devel.x86_64 0:1.0.1e-16.el6_5.7

Complete!
[root@centos65 ~]#

■バージョン再確認
[root@centos65 ~]# rpm -q openssl
openssl-1.0.1e-16.el6_5.7.x86_64
[root@centos65 ~]#
## 念のためビルドされた日時も確認
[root@centos65 ~]# openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Tue Apr  8 02:39:29 UTC 2014
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(8x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  dynamic
[root@centos65 ~]#
とりあえずこれで一安心。
ちなみに、OpenSSL 0.9.8系/1.0.0系については、この脆弱性は存在しないそうです。

こちらの情報が何かのお役に立てましたら幸いです。サイト継続ご協力のほどお願い申し上げます。m(_ _)m

2014年4月5日土曜日

CentOS 6系でVIP(仮想IP)を恒久的に設定する方法

1枚のNICに複数のIPアドレスを割り当てたい場合に重宝する設定です。
逆に複数のNICに1つのIPアドレスを割り当てる設定はNICチーミングです。
どちらも昔からある設定なので今更すぎますが・・・。
今回は恒久的に設定する方法を記載します。一時的に設定する方法はこちらです。
VIP(仮想IP)はWebサーバでVirtualHost設定時にIPを個別に割り当てたい場合等で便利です。

OS: CentOS 6.3(64-bit)


■VIP恒久設定用デバイスファイル作成
[root@cent63 ~]# cd /etc/sysconfig/network-scripts/
[root@cent63 network-scripts]# cp -p ifcfg-eth0 ifcfg-eth0:1
[root@cent63 network-scripts]# vi ifcfg-eth0:1
[root@cent63 network-scripts]# cat ifcfg-eth0:1
DEVICE="eth0:1"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
HWADDR=00:0C:29:D1:73:7C
IPADDR=192.168.16.136
PREFIX=24
GATEWAY=192.168.16.254
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0:1"
[root@cent63 network-scripts]#
とりあえず、「DEVICE」と「IPADDR」と「NAME」を設定。その他は変更なし。
※ifcfg-eth0:2も同様に準備。

■設定反映
[root@cent63 network-scripts]# /etc/init.d/network restart
インターフェース eth0 を終了中:                          [  OK  ]
インターフェース eth1 を終了中:                          [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                        [  OK  ]
インターフェース eth1 を活性化中:                        [  OK  ]
[root@cent63 network-scripts]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.36  Bcast:192.168.16.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:27ff:fad2:737c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0
          TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4380 (4.2 KiB)  TX bytes:12681 (12.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:86
          inet addr:192.168.7.54  Bcast:192.168.7.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:27ff:fad2:7386/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:180 (180.0 b)  TX bytes:4011 (3.9 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)

[root@cent63 network-scripts]#
反映されない…。(T-T)
調べてみると、CentOS5系までは上記の設定だけでOKだったが、6系からはudevを使用する方式に変更となったらしい。

■udev設定
udev(userspace device management)とは、カーネルがパソコンへの接続を検出したデバイスに対して、 動的に「デバイス・ファイル」を作成して割り当てるための仕組みだそうです。
[root@cent63 ~]# cd /etc/udev/rules.d/
[root@cent63 rules.d]# cp -p 70-persistent-net.rules 70-persistent-net.rules.org
[root@cent63 rules.d]# vi 70-persistent-net.rules
[root@cent63 rules.d]# cat 70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:d1:73:7c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:d1:73:7c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0:1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:d1:73:7c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0:2"

# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:d1:73:86", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
[root@cent63 rules.d]#
NAME="eth0"の行をマネして、NAME="eth0:1"とNAME="eth0:2"の行を追加。
設定を反映するにはOSの再起動が必要ですが、デバイスファイルを準備してからにしてください。

■NetworkManagerの停止
NetworkManager (ネットワークマネージャ) は、ネットワークデバイスと接続が利用可能な時に それらをアクティブに維持するよう試行する動的ネットワーク制御及び設定システムです。
⇒ので、サーバOSではほぼ不要です。っというか邪魔。
[root@cent63 ~]# /etc/init.d/NetworkManager stop
NetworkManager デーモンを停止中:                           [  OK  ]
[root@cent63 ~]# chkconfig NetworkManager off; chkconfig --list NetworkManager
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off
[root@cent63 ~]#

■VIP恒久設定用デバイスファイル再作成
[root@cent63 ~]# cd /etc/sysconfig/network-scripts/
[root@cent63 network-scripts]# cp -p ifcfg-eth0 ifcfg-eth0:1
[root@cent63 network-scripts]# vi ifcfg-eth0:1
[root@cent63 network-scripts]# cat ifcfg-eth0:1
DEVICE="eth0:1"
BOOTPROTO=static
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
# UUID="43f82f1f-073f-4494-8500-8f211ec8ede2"
# HWADDR=00:0C:29:D1:73:7C
IPADDR=192.168.16.136
PREFIX=24
# GATEWAY=192.168.16.254
# DNS1=192.168.16.10
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
# NAME="System eth0"
[root@cent63 network-scripts]#
70-persistent-net.rulesに記載したデバイスファイルは必ず準備してください。 でないと再起動後にネットワークに接続できなくなります。
NetworkManager関連等、不要な設定はコメントアウトとしました。
※ifcfg-eth0:2も同様に準備。

■ifcfg-ethxxの説明
## BOOTPROTO
BOOTPROTO には static というオプションはなく、dhcp、bootp、それ以外 となります。
明示的にアドレスを指定する場合は static、アドレスを与えないインターフェスの場合 none としておくのが慣例です。

## NM_CONTROLLED
yesにするとNetwork Managerの管理下に置かれる。今回は停止しているのでこの行をコメントアウトしてもよいが、明示的に"no"としています。

## ONBOOT
起動時にNICを有効化します。

## UUID
NetworkManagerでの識別子に使われるので、設定不要です。

## HWADDR
MACとインターフェースの関連付け。書いておいても問題ないが、udevとの二重管理になるのでコメントアウトしています。

## IPADDR
IPアドレスを指定しています。

## PREFIX
NETMASKと記載してもよいですが、RHEL6(CentOS6系)からはPREFIXが推奨されています。

## GATEWAY
NICごとに個別にゲートウェイを指定する場合はここに記載します。
今回はGateWayが1つなので、/etc/sysconfig/network の設定に従うということでコメントアウト。

## DNS1
NICごとに個別にDNSを指定する場合はここに記載します。
今回はDNSを個別設定しないので、/etc/resolv.conf の設定に従うということでコメントアウト。

## DEFROUTE
このオプションは複数NICを備えるサーバで、デフォルトの通信に利用されるインターフェースを指定します。
yesとしたインターフェースがデフォルト通信用になります。1NICの場合は指定してもしなくてもOK。

## IPV4_FAILURE_FATAL
IPv4の設定に失敗した場合、IPv6の設定を行う。
noで有効(IPv6を設定する)、yesで無効(IPv6を設定しない)

## IPV6INIT
IPv6を利用するか。今回は使用しません。

## NAME
NetworkManagerでの識別子に使われるので、設定不要です。

■設定反映と確認
[root@cent63 network-scripts]# /etc/init.d/network restart
インターフェース eth0 を終了中:                          [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                        [  OK  ]
インターフェース eth1 を活性化中:                        [  OK  ]
[root@cent63 network-scripts]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.36  Bcast:192.168.16.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:27ff:fad2:737c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17 errors:0 dropped:0 overruns:0 frame:0
          TX packets:49 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1434 (1.4 KiB)  TX bytes:7410 (7.2 KiB)

eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.136  Bcast:192.168.16.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0:2    Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.236  Bcast:192.168.16.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth1      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:86
          inet addr:192.168.7.54  Bcast:192.168.7.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:27ff:fad2:7386/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:120 (120.0 b)  TX bytes:3894 (3.8 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)

[root@cent63 network-scripts]#
udevを設定することにより、OSを再起動しても設定は保持されるようになります。

こちらの情報が何かのお役に立てましたら幸いです。サイト継続のご協力ありがとうございます。m(_ _)m

2014年4月4日金曜日

VIP(仮想IP)の設定と解除

1枚のNICに複数のIPアドレスを割り当てたい場合に重宝する設定です。
逆に複数のNICに1つのIPアドレスを割り当てる設定はNICチーミングです。
どちらも昔からある設定なので今更すぎますが・・・。
今回は一時的に設定する方法を記載します。恒久的に設定する方法は
CentOS 6系から方式が変更となっているため別ページで手順をまとめます。
VIP(仮想IP)はWebサーバでVirtualHost設定時にIPを個別に割り当てたい場合等で便利です。


OS: CentOS 6.3(64-bit)


■VIP設定(一時的)
既存のIP(192.168.16.36)に加えて2つのVIP(192.168.16.136、192.168.16.236)を設定します。
[root@cent63 ~]# ifconfig | grep -A 1 eth
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.36  Bcast:192.168.16.255  Mask:255.255.255.0
--
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:86
          inet addr:192.168.7.54  Bcast:192.168.7.255  Mask:255.255.255.0
[root@cent63 ~]#
[root@cent63 ~]# ifconfig eth0:1 192.168.16.136
[root@cent63 ~]# ifconfig eth0:2 192.168.16.236
[root@cent63 ~]#
[root@cent63 ~]# ifconfig | grep -A 1 eth
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.36  Bcast:192.168.16.255  Mask:255.255.255.0
--
eth0:1    Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.136  Bcast:10.255.255.255  Mask:255.0.0.0
--
eth0:2    Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.236  Bcast:10.255.255.255  Mask:255.0.0.0
--
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:86
          inet addr:192.168.7.54  Bcast:192.168.7.255  Mask:255.255.255.0
[root@cent63 ~]#
※一時的な設定です。OS再起動時には解除されます。

■解除方法
設定したVIPの逆順でdownしていきます。
[root@cent63 ~]# ifconfig eth0:2 down
[root@cent63 ~]# ifconfig eth0:1 down
[root@cent63 ~]# ifconfig | grep -A 1 eth
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:7C
          inet addr:192.168.16.36  Bcast:192.168.16.255  Mask:255.255.255.0
--
eth1      Link encap:Ethernet  HWaddr 00:0C:29:D1:73:86
          inet addr:192.168.7.54  Bcast:192.168.7.255  Mask:255.255.255.0
[root@cent63 ~]#

VIPを恒久的に設定する手順はこちらのページでまとめます。

こちらの情報が何かのお役に立てましたら幸いです。サイト継続のご協力ありがとうございます。m(_ _)m

2014年4月2日水曜日

直リンク(直接URL入力でのアクセス)を禁止するhttpd.conf設定

Webサイトの内容によってはブラウザに直接URLを入力してアクセスされたくないページや外部のサイトからリンクされたくないページが存在する場合があります。

SetEnvIf Referer を設定すると指定ディレクトリ以下のページ(画像等を含む)への直リンクを禁止することが可能です。

OS: RedHat EL 6.5(64-bit)
Apache: 2.2.15


■httpd.confの最下行に追加
[root@centos65 ~]# tail /etc/httpd/conf/httpd.conf
# Direct Link ban
<Directory "/var/www/html/direct_ng">
    SetEnvIf Referer "^http://192.168.77.149/" allow_ref
    # External Links ban
    # SetEnvIf Referer "^$" allow_ref
    order deny,allow
    deny from all
    allow from env=allow_ref
    ErrorDocument 403 /403.html
</Directory>
[root@centos65 ~]#
SetEnvIf Referer の URLは「http://」から書き、先頭には半角で「^」(ハット)記号を加えた方が、アクセス制御レベルが高まります。
今回はコメントアウトしていますが、URL直入力は許可し外部サイトからのリンクを禁止する場合は、URLの部分を "^$" と記述します。
直リンクされた場合はステータスコード403が返るので、それに対応するページを準備します。

■動作確認
ブラウザに直接URLを入力して http://192.168.77.149/direct_ng/ にアクセスすると 403.html ページが表示されます。

403.html は5秒後に direct_ok ページに自動遷移するように設定しています。

http://192.168.77.149/direct_ok/ ページからリンクすれば http://192.168.77.149/direct_ng/ ページが表示されます。


■直リンクされたときのアクセスログ
[root@centos65 ~]# tail -f /var/log/httpd/access_log

192.168.77.13 - - [02/Apr/2014:23:33:04 +0900] "GET /direct_ng/ HTTP/1.1" 403 370 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"
192.168.77.13 - - [02/Apr/2014:23:33:09 +0900] "GET /direct_ok/ HTTP/1.1" 200 338 "http://192.168.77.149/direct_ng/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"
192.168.77.13 - - [02/Apr/2014:23:33:37 +0900] "GET /direct_ng/ HTTP/1.1" 200 284 "http://192.168.77.149/direct_ok/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"

■テストページhtmlサンプル
## 直リンクOKページ
[root@centos65 ~]# cat /var/www/html/direct_ok/index.html
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Direct Link OK</title>
</head>
<body bgcolor="#33ffcc">
  <h1>Direct Link OK</h1>
  <h2>/var/www/html/direct_ok/index.html</h2>
  <a href="/direct_ng/">direct_ng</a><br />
</body>
</html>
[root@centos65 ~]#

## 直リンクNGページ
[root@centos65 ~]# cat /var/www/html/direct_ng/index.html
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Direct Link NG</title>
</head>
<body bgcolor="#ff6699">
  <h1>Direct Link NG</h1>
  <h2>/var/www/html/direct_ng/index.html</h2>
  <a href="/direct_ok/">direct_ok</a><br />
</body>
</html>
[root@centos65 ~]#

## 403ページ
[root@centos65 ~]# cat /var/www/html/403.html
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="refresh" content="5; url=/direct_ok/">
<title>Forbidden</title>
</head>
<body bgcolor="#cccccc">
  <h1>Forbidden</h1>
  <p>/var/www/html/403.html</p>
  <p>This page is not allowed to be Direct Link.</p>
  <a href="/direct_ok/">direct_ok</a><br />
</body>
</html>
[root@centos65 ~]#

こちらの情報が何かのお役に立てましたら幸いです。サイト継続ご協力のほどお願い申し上げます。m(_ _)m