セキュアなサーバーメンテナンス -社内のLDAPサーバーによるユーザー認証の実現-
こんにちは、ちなつです。
最近は、今年の9月に提供を予定しているクラウドストレージ(現在モニター募集中!)の準備で大忙しです。
さて今回は、プログラマーとしてだけでなく、サーバー管理や営業もこなすオールラウンドなライター・石田健亮氏の記事をご紹介します。
(*本記事の最後に石田氏のプロフィールを掲載しています)
*********************************************************************
こんにちは、ドリーム・アーツの石田です。弊社ではニフティクラウドを使って小売業向けの多店舗コミュニケーションを支援する「Shopらん」をSaaSとして提供しています。 今回は、ニフティクラウドで企業としてSaaSを運用するときに、きっと大問題となるサーバーのメンテナンス時の認証について弊社のケースに書いてみます。
なぜ認証が問題になるのか
ニフティクラウドでCentOSなどLinuxのサーバーを利用しているとき、通常は電子証明書の秘密鍵をつかってsshでログインしてメンテナンスすることになります。
電子証明書なので一見セキュアに見えますが、この方法では以下のようにいろいろ問題があり、商用サービスを運用する基盤にするにはセキュリティ的に脆弱であるといえます。
さて、弊社ではこれらの課題を以下のように解決しています。
セキュアなメンテ用ログインの概略
弊社で実際に運用している環境のメンテナンス用のログイン方法はおよそ以下の図のようになっています。(※ 実際にはもっとたくさんの関門やリアルタイム監査がありますが概略ということで・・・)
サーバーのメンテナンスをするには、まず図の右にある認証サーバーにSSHに個人別のアカウントでログインし(①)、そのサーバーで共通のメンテナンスユーザーに昇格し(②)、認証サーバーから内部ネットワークを経由して証明書を使って各サーバーにSSHでログインします。
サービスを構成しているWebサーバーやDBサーバーなどのインターネット側のネットワークは、iptablesでガチガチに守ってあり必要なポートしか開けていません。
また、内部ネットワークは認証サーバーからのSSH接続のみを受け付けるように設定しています。
この構成で重要なのは、認証サーバーのセキュリティです。特に最初の運用担当者ごとのSSHでのログインをいかにセキュアに行うかが鍵になります。
こういう運用担当者ごとのアカウントを管理する場合、認証サーバー自体にローカルユーザーを作って運用するというのが普通ですが、異動や入社、退職に伴ってアカウントをきちんと管理し続けることは正直難しいです。 特に運用開始から月日が経つと。
弊社では、このSSHの個人別の認証について、社内のメールサーバーと、グループウェアのアカウント管理に使用しているLDAPサーバーを使い一元的にユーザー管理を実施するようにすることで、確実に運用されることを保証しています。(メールアカウントは人事部門で管理してくれますからね)
社内のLDAPサーバーでSSHの認証を実現
ニフティクラウドにあるサーバーで社内のLDAPサーバーを利用しようとした場合の課題は、ニフティクラウドのサーバーから社内のLDAPサーバーにどうやって接続するかという点です。多くの場合、社内のLDAPサーバーは当然LANの中にありグローバルアドレスは割り振られていません。またたとえグローバルアドレスがあってもLDAPサーバーへのアクセスポートを開けるなんてことはしたくありません。
そこで、社内にあるサーバー(以下、[office]というプロンプト)からニフティクラウドのサーバー(以下、[nifty]というプロンプト)にSSHで接続してLDAPへのアクセスをトンネルするようにします。
社内からニフティへLDAP接続トンネルを作成
これは簡単で、まずニフティクラウドのサーバーの秘密鍵のPEMファイルを社内のサーバーに転送し、opensslコマンドでパスフレーズを解除した秘密鍵を作ります。
パスフレーズ付きの秘密鍵が、pkey.pemというファイルだったときに、パスフレーズなしの秘密鍵を作るには以下のようにします。
[office]# openssl rsa -in pkey.pem > pkey-nopass.pem Enter pass phrase for pkey.pem: writing RSA key
これで、pkey-nopass.pemというファイル名でパスフレーズ無しの秘密鍵のファイルが出来上がります。
必ずパーミッションは 400 にしておかなければいけません。
[office]# chmod 400 pkey-nopass.pem
次に、この秘密鍵を使ってニフティクラウド上のサーバーにLDAPサーバーのポートを転送します。
[office]# ssh -i ./pkey-nopass.pem -R 389:localhost:389 -N xxx.xxx.xxx.xxx
このコマンドを社内のLDAPサーバー側で実行すると、ニフティクラウド上のサーバーではなんと localhost:389 で社内のLDAPサーバーにアクセスできるようになります。さっそくOpenLDAPのldapsearchコマンドをつかって検索してみましょう。
まずは、OpenLDAPのクライアントをインストール。
[nifty]# yum -y install openldap-clients.x86_64
早速、検索。
[nifty]# ldapsearch -x -h localhost -b o=YourCompany,c=JP '(uid=ishida)' # extended LDIF # # LDAPv3 # basewith scope subtree # filter: (uid=ishida) # requesting: ALL # # ishida, Users, YourCompany, JP dn: uid=ishida,ou=Users,o=YourCompany,c=JP objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: qmailUser objectClass: sambaSamAccount sambaPwdMustChange: *********** sambaNTPassword: ********************************** userPassword:: ********************************************** sambaPwdLastSet: 1261727845 sambaPwdCanChange: 1261727845 sambaLMPassword: 3B39E018A4C4BC10AAD3B435B51404EE sambaAcctFlags: [U] sambaSID: S-1-5-21-2361600604-3951323631-1722907941-2001048 mailHost: xxx.xxx.xxx.xxx mail: xxxxxxxx@dreamarts.co.jp qmailGID: 2000275 cn;lang-ja:: 55+z55SwIOWBpeS6rg== sambaPrimaryGroupSID: S-1-5-21-2361600604-3951323631-1722907941-4001551 uidNumber: 1000024 qmailUID: 1000024 gidNumber: 2000275 homeDirectory: /home/1000024 cn: Kensuke ISHIDA sn: Kensuke ISHIDA iseAccountStatus: active loginShell: /bin/bash uid: ishida # search result search: 2 result: 0 Success
うまくいきました。ニフティクラウドのサーバーから社内のLDAPサーバーを検索できています。社内サーバーの起動時に自動的にLDAP接続を起動したり、接続が切れたときに自動的に再接続するには、daemontoolsを設定してもいいのですが、以下のような簡単なスクリプトを作成して、rc.localなどからサーバーの起動時に起動するようにしておくと便利です。
#!/bin/bash while : do echo 'connecting SSH tunnel to noumena.shoprun.jp' nohup ssh -i /path/to/pkey-nopass.pem -R 389:localhost:389 -N noumena.shoprun.jp 2> /dev/null sleep 60 done
ニフティクラウドのサーバーでLDAP認証を設定
CentOSでLDAPを使ったユーザー検索と認証を有効にするには、authconfig-tuiコマンドを使うと簡単です。WindowsからPuTTYを使って接続した場合、日本語のままでは画面表示が乱れるので一時的に英語ロケールにして起動します。
[nifty] # LANG=C authconfig-tui
次に、SSHでパスフレーズでのログインを可能にします。/etc/ssh/sshd_config を編集して、PasswordAuthentication を yes に変更します。
# To disable tunneled clear text passwords, change to no here! PasswordAuthentication yes #PermitEmptyPasswords no #PasswordAuthentication no
sshd を再起動した瞬間から、LDAPでの認証が可能になります。
ログインできるユーザーを制限する
この状態だと、LDAPで検索できるユーザーは誰でもログインできるようになっています。運用担当者のみに制限したい場合は、/etc/ldap.conf の pam_filter でLDAP上の検索フィルターで指定するか、認可するユーザーを個別に、/etc/security/access.conf に記述するようにします。
/etc/security/access.conf を使う場合は、まず /etc/pam.d/sshd に以下の行を追加します。
account required pam_access.so
そして、/etc/security/access.conf にログインできるユーザーを以下のように設定します。
-:ALL EXCEPT ishida user1 user2 root:ALL
上の例では、ユーザー ishida と user1 と user2 のみがログインできるように設定されています。
最後に要望をひとつ
ニティクラウドで作成したサーバーについては十分にセキュアな運用が可能になりましたが、ひとつ問題が残っています。それはニフティクラウドのコントロールパネルです。
コントロールパネルを利用するときの認証は、ニフティクラウドのIDとパスワードでの認証のみで、運用担当者の個人ごとに認証することができません。このあたりは運用担当者ごとにアカウントを作成できて監査ログが確認できるようになるといいですね。今後に期待しています。
------------------------------------
プロフィール
ライターネーム:石田 健亮
株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」
を企画、開発。
メインの仕事はプログラマーだがサーバー管理や営業もこなす
ユーティリティプレイヤー。
最近好きな事はパフォーマンスチューニング。
特に並列化プログラミングがマイブーム。
キライなことはデータセンターでの作業。騒音と乾燥が弱点。
ニフティクラウドでデータセンターに行く必要が無くなったことが
本当の利点だと思っている。
------------------------------------