2014年11月30日日曜日

distAuth冗長化

事前にLB(apache2.2のhttpd.conf)に以下の設定をしておく。(apache再起動要)

~~ ここから ~~

ProxyRequests off
ProxyPreserveHost on
<Proxy *>
    order deny,allow
    Allow from all
</Proxy>
<Proxy balancer://distauth>
    BalancerMember http://sol10-distauth1.openam.net:8080 retry=300 route=server1
    BalancerMember http://sol10-distauth2.openam.net:8080 retry=300 route=server2
    ProxySet lbmethod=byrequests
    ProxySet stickysession=APLBCOOKIE
</Proxy>
Header add Set-Cookie "APLBCOOKIE=APACHE.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED
ProxyPass /       balancer://distauth/
ProxyPassReverse / http://sol10-distauth1.openam.net:80/
ProxyPassReverse / http://sol10-distauth2.openam.net:80/
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 1
HostnameLookups Off
~~ ここまで ~~

distauth.warをdistauth1号機、2号機のTomcatのwebapps配下に配備して、Tomcat再起動する。
※ここではdistauth.warをTomcatで動作させることを前提。

次にdistauthのセットアップを行う。 ※1号機、2号機の違いはDistauth Server HostとAncryption Keyのみ。

<例:2号機>

OpenAM管理コンソールの [アクセス制御] - [/(root)レルム] - [一般] タブのDNSエイリアスにdistauth2台と仮想distauth(sol10-lb)のFQDNを登録する。

 
Webブラウザより
http://sol10-lb.openam.net:80/distauth/UI/Login?goto=http://sol10-openam-core.openam.net:8080/openam にアクセスする。 ※gotoパラメタでOpenAM管理コンソールのアドレスを指定。


 

OpenAM管理コンソールにログインできることを確認する。


次に、OpenAM管理コンソールの [設定] - [サーバーおよびサイト] - [サーバー名(http://sol10-openam-core.openam.net:8080/openam)] - [高度] タブに以下を追加。

プロパティ名:com.sun.identity.authentication.client.ipAddressHeader
プロパティ値:X-Forwarded-For


OpenAM管理コンソールの [設定] - [サーバーおよびサイト] - [デフォルトのサーバー設定値] - [高度] タブで以下を変更。

プロパティ名:openam.retained.http.request.headers
プロパティ値:X-DSAMEVersion ⇒ X-DSAMEVersion,X-Forwarded-For


[高度] タブを編集する場合はTomcat再起動する。
 ※ここではopenam.warをTomcatで動作させることを前提。

次に、distauth1号機、2号機の{Tomcat実行ユーザ}/FAMDistAuth/_usr_local_apache-tomcat-6.0.35_webapps_distauth_AMDistAuthConfig.propertiesファイルを開いて、以下を編集して、Tomcat再起動する。

<1号機>
・変更
#openam.retained.http.request.headers=X-DSAMEVersion
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For

・追記
com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
com.sun.identity.distauth.cluster=http://sol-distauth1.openam.net:8080/distauth/UI/Login,http://sol-distauth2.openam.net:8080/distauth/UI/Login

<2号機>
・変更
#openam.retained.http.request.headers=X-DSAMEVersion
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For
・追記
com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
com.sun.identity.distauth.cluster=http://sol-distauth2.openam.net:8080/distauth/UI/Login,http://sol-distauth1.openam.net:8080/distauth/UI/Login


snoopを仕掛ける。
bash-3.00# snoop -o /tmp/out1.txt port 8080 host sol10-distauth1.openam.net
bash-3.00# snoop -o /tmp/out2.txt port 8080 host sol10-distauth2.openam.net

DistAuth経由でdemo/changeitでログイン。





キャプチャを取ると、X-Forwarded-ForにクライアントのIPアドレスが含まれている。

bash-3.00# snoop -i /tmp/out1.txt -x 50 > /tmp/distauth1.txt
bash-3.00# snoop -i /tmp/out2.txt -x 50 > /tmp/distauth2.txt

~~ キャプチャ(ここから) ~~
<例:2号機>
         320           0: 19f5 0000 504f 5354 202f 6469 7374 6175    ....POST /distau
          16: 7468 2f55 492f 4c6f 6769 6e20 4854 5450    th/UI/Login HTTP
          32: 2f31 2e31 0d0a 486f 7374 3a20 736f 6c31    /1.1..Host: sol1
          48: 302d 6c62 2e6f 7065 6e61 6d2e 6e65 740d    0-lb.openam.net.
          64: 0a55 7365 722d 4167 656e 743a 204d 6f7a    .User-Agent: Moz
          80: 696c 6c61 2f35 2e30 2028 5769 6e64 6f77    illa/5.0 (Window
          96: 7320 4e54 2036 2e31 3b20 574f 5736 343b    s NT 6.1; WOW64;
         112: 2072 763a 3237 2e30 2920 4765 636b 6f2f     rv:27.0) Gecko/
         128: 3230 3130 3031 3031 2046 6972 6566 6f78    20100101 Firefox
         144: 2f32 372e 300d 0a41 6363 6570 743a 2074    /27.0..Accept: t
         160: 6578 742f 6874 6d6c 2c61 7070 6c69 6361    ext/html,applica
         176: 7469 6f6e 2f78 6874 6d6c 2b78 6d6c 2c61    tion/xhtml+xml,a
         192: 7070 6c69 6361 7469 6f6e 2f78 6d6c 3b71    pplication/xml;q
         208: 3d30 2e39 2c2a 2f2a 3b71 3d30 2e38 0d0a    =0.9,*/*;q=0.8..
         224: 4163 6365 7074 2d4c 616e 6775 6167 653a    Accept-Language:
         240: 206a 612c 656e 2d75 733b 713d 302e 372c     ja,en-us;q=0.7,
         256: 656e 3b71 3d30 2e33 0d0a 4163 6365 7074    en;q=0.3..Accept
         272: 2d45 6e63 6f64 696e 673a 2067 7a69 702c    -Encoding: gzip,
         288: 2064 6566 6c61 7465 0d0a 5265 6665 7265     deflate..Refere
         304: 723a 2068 7474 703a 2f2f 736f 6c31 302d    r: http://sol10-
         320: 6c62 2e6f 7065 6e61 6d2e 6e65 742f 6469    lb.openam.net/di
         336: 7374 6175 7468 2f55 492f 4c6f 6769 6e3f    stauth/UI/Login?
         352: 676f 746f 3d68 7474 703a 2f2f 736f 6c31    goto=http://sol1
         368: 302d 6f70 656e 616d 2d63 6f72 652e 6f70    0-openam-core.op
         384: 656e 616d 2e6e 6574 3a38 3038 302f 6f70    enam.net:8080/op
         400: 656e 616d 0d0a 436f 6f6b 6965 3a20 4a53    enam..Cookie: JS
         416: 4553 5349 4f4e 4944 3d37 3133 4230 3538    ESSIONID=713B058
         432: 3633 3539 4244 3645 4438 3841 3630 3342    6359BD6ED88A603B
         448: 4342 3335 3838 3937 463b 2061 6d6c 6263    CB358897F; amlbc
         464: 6f6f 6b69 653d 3031 3b20 414d 4469 7374    ookie=01; AMDist
         480: 4175 7468 436f 6f6b 6965 3d22 6874 7470    AuthCookie="http
         496: 3a2f 2f73 6f6c 3130 2d64 6973 7461 7574    ://sol10-distaut
         512: 6832 2e6f 7065 6e61 6d2e 6e65 743a 3830    h2.openam.net:80
         528: 3830 2f64 6973 7461 7574 682f 5549 2f4c    80/distauth/UI/L
         544: 6f67 696e 223b 2044 6973 7441 7574 684c    ogin"; DistAuthL
         560: 4243 6f6f 6b69 654e 616d 653d 4469 7374    BCookieName=Dist
         576: 4175 7468 4c42 436f 6f6b 6965 5661 6c75    AuthLBCookieValu
         592: 653b 2041 504c 4243 4f4f 4b49 453d 4150    e; APLBCOOKIE=AP
         608: 4143 4845 2e73 6572 7665 7232 0d0a 436f    ACHE.server2..Co
         624: 6e74 656e 742d 5479 7065 3a20 6170 706c    ntent-Type: appl
         640: 6963 6174 696f 6e2f 782d 7777 772d 666f    ication/x-www-fo
         656: 726d 2d75 726c 656e 636f 6465 640d 0a58    rm-urlencoded..X
         672: 2d46 6f72 7761 7264 6564 2d46 6f72 3a20    -Forwarded-For:
         688: 3139 322e 3136 382e 3131 2e34 0d0a 582d    192.168.11.4..X-
         704: 466f 7277 6172 6465 642d 486f 7374 3a20    Forwarded-Host:
         720: 736f 6c31 302d 6c62 2e6f 7065 6e61 6d2e    sol10-lb.openam.
         736: 6e65 740d 0a58 2d46 6f72 7761 7264 6564    net..X-Forwarded
         752: 2d53 6572 7665 723a 206c 622e 6f70 656e    -Server: lb.open
         768: 616d 2e6e 6574 0d0a 436f 6e6e 6563 7469    am.net..Connecti
         784: 6f6e 3a20 4b65 6570 2d41 6c69 7665 0d0a    on: Keep-Alive..
         800: 436f 6e74 656e 742d 4c65 6e67 7468 3a20    Content-Length:
         816: 3231 330d 0a0d 0a49 4454 6f6b 656e 313d    213....IDToken1=
         832: 6465 6d6f 2649 4454 6f6b 656e 323d 6368    demo&IDToken2=ch
         848: 616e 6765 6974 2649 4442 7574 746f 6e3d    angeit&IDButton=
         864: 2545 3325 3833 2541 4425 4533 2538 3225    %E3%83%AD%E3%82%
         880: 4230 2545 3325 3832 2541 3425 4533 2538    B0%E3%82%A4%E3%8
         896: 3325 4233 2667 6f74 6f3d 6148 5230 6344    3%B3&goto=aHR0cD
         912: 6f76 4c33 4e76 6244 4577 4c57 3977 5a57    ovL3NvbDEwLW9wZW
         928: 3568 6253 316a 6233 4a6c 4c6d 3977 5a57    5hbS1jb3JlLm9wZW
         944: 3568 6253 3575 5a58 5136 4f44 4134 4d43    5hbS5uZXQ6ODA4MC
         960: 3976 6347 5675 5957 3025 3344 2667 6f74    9vcGVuYW0%3D&got
         976: 6f4f 6e46 6169 6c3d 2653 756e 5175 6572    oOnFail=&SunQuer
         992: 7950 6172 616d 7353 7472 696e 673d 2665    yParamsString=&e
        1008: 6e63 6f64 6564 3d74 7275 6526 6778 5f63    ncoded=true&gx_c
        1024: 6861 7273 6574 3d55 5446 2d38              harset=UTF-8
~~ キャプチャ(ここまで) ~~

OpenAM 11のマニュアルにないが、sunRemoteAuthSecurityEnabledのパラメタが必要。
# ./ssoadm set-attr-defs -u amadmin -f /tmp/pwd.txt -s iPlanetAMAuthService -t Global -a "sunRemoteAuthSecurityEnabled=true"
スキーマのデフォルト属性値が設定されました。

ここで試したところ、DistAuthの定義ファイルの設定値と"sunRemoteAuthSecurityEnabled"の値によって、ログに記録されるIPアドレスに変化があった。

●LBのIPアドレスが出る場合
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For
#com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
"sunRemoteAuthSecurityEnabled=true"

<例:192.168.11.5はLB>
"2014-11-30 14:45:25"   ログインに成功しました|isNoSession=false        id=demo,ou=user,dc=openam,dc=forgerock,dc=org   5237d414e4b8b7101       192.168.11.5   INFO     dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-100      DataStore       "Not Available"192.168.11.5
"2014-11-30 14:45:27"   ログアウト      id=demo,ou=user,dc=openam,dc=forgerock,dc=org   5237d414e4b8b7101       192.168.11.5    INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-300      DataStore       "Not Available" 192.168.11.5

●クライアントのIPアドレスが出る場合
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For
com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
"sunRemoteAuthSecurityEnabled=true"

<例:192.168.11.4はクライアント>
"2014-11-30 14:51:19"   ログインに成功しました|isNoSession=false        id=demo,ou=user,dc=openam,dc=forgerock,dc=org   561402e350fe9ae801      192.168.11.4   INFO     dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-100      DataStore       "Not Available"192.168.11.4
"2014-11-30 14:51:22"   ログアウト      id=demo,ou=user,dc=openam,dc=forgerock,dc=org   561402e350fe9ae801      192.168.11.4    INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-300      DataStore       "Not Available" 192.168.11.4

●DistAuthのIPアドレスが出る場合
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For
com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
"sunRemoteAuthSecurityEnabled=false"

<例:192.168.11.15はDistAuth1号機>
"2014-11-30 15:18:25"   ログインに成功しました|isNoSession=false        id=demo,ou=user,dc=openam,dc=forgerock,dc=org   ee680ef4404d6f0301      192.168.11.15  INFO     dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-100      DataStore       "Not Available"192.168.11.15
"2014-11-30 15:18:30"   ログアウト      id=demo,ou=user,dc=openam,dc=forgerock,dc=org   ee680ef4404d6f0301      192.168.11.15   INFO    dc=openam,dc=forgerock,dc=org   "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org"     AUTHENTICATION-300      DataStore       "Not Available" 192.168.11.15

結論として、ロードバランサをとおしてクライアントのIPアドレスをログ(audit log)に出すには以下が必要。

・DistAuthの定義ファイルに以下を設定
openam.retained.http.request.headers=X-DSAMEVersion,X-Forwarded-For
com.sun.identity.distauth.cluster=http://sol-distauth1.openam.net:8080/distauth/UI/Login,http://sol-distauth2.openam.net:8080/distauth/UI/Login
com.sun.identity.authentication.client.ipAddressHeader=X-Forwarded-For
・DistAuthの定義とOpenAM管理コンソールの[高度]タブの設定を合わせる
・ssoadmコマンドで"sunRemoteAuthSecurityEnabled=true"を設定
・Tomcat再起動(distAuth、OpenAMとも)