ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

セキュアなサーバーメンテナンス -社内のLDAPサーバーによるユーザー認証の実現-

こんにちは、ドリーム・アーツの石田です。弊社ではニフティクラウドを使って小売業向けの多店舗コミュニケーションを支援する「Shopらん」をSaaSとして提供しています。 今回は、ニフティクラウドで企業としてSaaSを運用するときに、きっと大問題となるサーバーのメンテナンス時の認証について弊社のケースに書いてみます。

なぜ認証が問題になるのか

ニフティクラウドCentOSなどLinuxのサーバーを利用しているとき、通常は電子証明書秘密鍵をつかってsshでログインしてメンテナンスすることになります。

電子証明書なので一見セキュアに見えますが、この方法では以下のようにいろいろ問題があり、商用サービスを運用する基盤にするにはセキュリティ的に脆弱であるといえます。

(1) 運用担当者が複数になったとき、誰がログインしたのかの証跡を保存できない
(2) サーバー台数が複数になったとき、各サーバーでインターネット経由でのログインを許可しなければならない
(3) 運用担当者が異動で交代したときに、証明書などが流出したりといったリスクがある

    さて、弊社ではこれらの課題を以下のように解決しています。

    セキュアなメンテ用ログインの概略

    弊社で実際に運用している環境のメンテナンス用のログイン方法はおよそ以下の図のようになっています。(※ 実際にはもっとたくさんの関門やリアルタイム監査がありますが概略ということで・・・)

    Maintenance_4

    サーバーのメンテナンスをするには、まず図の右にある認証サーバーに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
    # base  with 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認証を設定

    CentOSLDAPを使ったユーザー検索と認証を有効にするには、authconfig-tuiコマンドを使うと簡単です。WindowsからPuTTYを使って接続した場合、日本語のままでは画面表示が乱れるので一時的に英語ロケールにして起動します。

    [nifty] # LANG=C authconfig-tui
    

    Autoconfigtui_1_2 Autoconfigtui_2_2

    次に、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とパスワードでの認証のみで、運用担当者の個人ごとに認証することができません。このあたりは運用担当者ごとにアカウントを作成できて監査ログが確認できるようになるといいですね。今後に期待しています。