Symfoware

Symfowareについての考察blog

Debian 8 + NginxでActive Directory認証を使用する

nginxでの認証方法を調べています。

Debian 8 + NginxでBasic認証の設定
Debian 8 + NginxでPAMを使用した認証

今回は、pam_krb5を使用してActive Directory認証してみます。
Active DirectoryはWindows Server 2016で構築したものを使用しました。
Windows Server 2016にActiveDirectoryの機能を追加



nginxのインストール



pam認証モジュールが使用できるようnginx-extrasをインストールしました。
nginx-fullでも問題ないと思います。


# apt-get install nginx-extras




続いて、libpam-krb5をインストール。
これがケルベロス認証を行うモジュールになります。


# apt-get install libpam-krb5




インストール中、ドメイン名を尋ねられるので「大文字で」ドメイン名を入力します。

721_01.png


続いて、サーバーのホスト名の入力を求められます。
こちらはIPアドレスを入力しました。

721_02.png

721_03.png


ここで入力した値は、「/etc/krb5.conf」に反映されます。
もし、インストール時に初期値を指定しなかった場合は、直接ファイルを編集します。


# vi /etc/krb5.conf




追加されるのは以下の2箇所のようです。


[libdefaults]
    default_realm = TEST.LOCAL

# The following krb5.conf variables are only for MIT Kerberos.
    krb4_config = /etc/krb.conf
    krb4_realms = /etc/krb.realms


(略)


[realms]
    TEST.LOCAL = {
        kdc = 192.168.1.110
        admin_server = 192.168.1.110
    }







pamファイルの設定



ここでやったノウハウが役に立ちました。
Debian 8 + NginxでPAMを使用した認証

まず、Active Directory認証するための設定ファイルを作成します。
試行錯誤の結果、これで良いようです。


# vi /etc/pam.d/nginx_krb5



内容は以下の2行。


auth        sufficient    pam_krb5.so use_first_pass
account     sufficient    pam_krb5.so




続いて、このファイルを使用した認証を行うよう、nginxの設定ファイルを変更します。


# vi /etc/nginx/sites-available/default




テスト的に、locationに設定しました。


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                auth_pam "Secure Zone";
                auth_pam_service_name "nginx_krb5";

        }




「nginx_krb5」という名前は、/etc/pam.d/に作成したファイル名と揃えます。
auth_pamに指定する文字列は、認証ダイアログに表示されます。

設定が終わったらnginxを再起動。


# service nginx restart




これで設定は完了です。






認証テスト



Active Directoryに適当なユーザーを作成します。
今回は「madoka」というユーザーを作成しました。

721_04.png


ブラウザでアクセスしてみると、ちゃんと認証ダイアログが表示されます。

721_05.png


Active Directoryで設定したユーザーID、パスワードを入力すると認証を通過できます。

721_06.png

/var/log/auth.logに認証のログが出力されます。
こんなログが出力されているはずです。


Dec 4 22:46:20 debian-ad ker process: pam_krb5(nginx_krb5:auth): user madoka authenticated as madoka@TEST.LOCAL






【参考URL】


http://www.bnote.net/kuro_box/krb5_ad.shtml
http://infra.blog.shinobi.jp/Entry/93/

https://www.linux.iastate.edu/content/using-pam-kerberos-authentication-and-group-access-control
http://serverfault.com/questions/442286/restrict-su-to-domain-user-in-winbind-kerberos-linux-ad-integration

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/12/04(日) 23:28:47|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

PHP 「@」でエラー抑止していても処理が途中で終了する

例えばこんなコード。


  1. <?php
  2. // とりあえずファイルを開こうとしてみる
  3. // 存在しない場合のエラーは「@」で抑止
  4. $file = @file_get_contents('dummy.txt');
  5. if ($file === false) {
  6.     echo 'ファイルが存在しません'.PHP_EOL;
  7.     
  8. } else {
  9.     echo $file.PHP_EOL;
  10. }



「@」でエラーを抑止し、とりあえずファイルを開いてみる。
戻り値がfalseだったらファイルが存在しないと判断。


$ php sample.php
ファイルが存在しません




このような処理が書いてあるプログラムで、ある環境ではうまく動くのですが、
別の環境ではファイルが存在しない時に処理が止まってしまい悩んでいました。

よくよく調べてみると、動かない環境では事前に読み込んでいるファイルで
「set_error_handler」が設定されており、ここでexitしています。


  1. <?php
  2. // -------------------------------------------
  3. // 事前に読み込まれるファイルで実行されている処理
  4. function _hook_exception_handler($severity, $message, $filepath, $line) {
  5.     echo $message.PHP_EOL;
  6.     exit();
  7. }
  8. set_error_handler('_hook_exception_handler');
  9. // -------------------------------------------
  10. // とりあえずファイルを開こうとしてみる
  11. // 存在しない場合のエラーは「@」で抑止
  12. $file = @file_get_contents('dummy.txt');
  13. if ($file === false) {
  14.     echo 'ファイルが存在しません'.PHP_EOL;
  15.     
  16. } else {
  17.     echo $file.PHP_EOL;
  18. }





$ php sample.php
file_get_contents(dummy.txt): failed to open stream: No such file or directory




なるほど、エラーを抑止しててもエラー発生時の処理でexitされたら
プログラムの実行は止まりますよね。


該当処理の直前で「set_error_handler(null)」とすることで問題を回避しました。


  1. <?php
  2. // -------------------------------------------
  3. // 事前に読み込まれるファイルで実行されている処理
  4. function _hook_exception_handler($severity, $message, $filepath, $line) {
  5.     echo $message.PHP_EOL;
  6.     exit();
  7. }
  8. set_error_handler('_hook_exception_handler');
  9. // -------------------------------------------
  10. // デフォルトのエラー設定を解除
  11. // 戻り値は変更前の設定無いようなので対比しておく
  12. $error_handlers = set_error_handler(null);
  13. // とりあえずファイルを開こうとしてみる
  14. // 存在しない場合のエラーは「@」で抑止
  15. $file = @file_get_contents('dummy.txt');
  16. if ($file === false) {
  17.     echo 'ファイルが存在しません'.PHP_EOL;
  18.     
  19. } else {
  20.     echo $file.PHP_EOL;
  21. }
  22. echo '初期値に復元'.PHP_EOL;
  23. // エラー設定を元に戻す
  24. set_error_handler($error_handlers);
  25. $file = @file_get_contents('dummy.txt');
  26. if ($file === false) {
  27.     echo 'ファイルが存在しません'.PHP_EOL;
  28.     
  29. } else {
  30.     echo $file.PHP_EOL;
  31. }




狙い通り、最初の処理だけ_hook_exception_handlerが実行されないようになりました。


$ php sample.php
ファイルが存在しません
初期値に復元
file_get_contents(dummy.txt): failed to open stream: No such file or directory




これ、半日ぐらいはまりましたよ...



【参考URL】

set_error_handler


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/12/04(日) 16:55:56|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu Systemdでプログラムをサービス起動する(窓使いの憂鬱)

今まで窓使いの憂鬱(mayu)をinit.dで起動していました。
Ubuntu 16.04に窓使いの憂鬱をインストールする

OSを再インストールする機会があったので、init.dによる起動ではなく、
systemdによる起動に変更しようと思います。


serviceファイルの作成



こちらを参考にしました。
Systemdを使ってさくっと自作コマンドをサービス化してみる
systemdについて調べたメモ

窓使いの憂鬱のインストールと、設定ファイル(~/.mayu)の編集が終わっているところから始めます。

「mayu.service」というファイルを作成。


$ sudo vi /etc/systemd/system/mayu.service




内容は以下の通り。


[Unit]
Description = mayu daemon

[Service]
ExecStart = /usr/local/bin/mayu
Restart = always
Type = simple

Environment="HOME=[.mayuファイルを保存したディレクトリ]"

[Install]
WantedBy = multi-user.target




Environmentの指定は環境により異なります。
私の環境ではこうなりました。


[Unit]
Description = mayu daemon

[Service]
ExecStart = /usr/local/bin/mayu
Restart = always
Type = simple

Environment="HOME=/home/baranche"

[Install]
WantedBy = multi-user.target




サービスとして認識されたかチェックします。


$ sudo systemctl list-unit-files --type=service | grep mayu

mayu.service                             disabled



ちゃんと結果が表示されました。
サービスを有効にします。


$ sudo systemctl enable mayu




サービスを開始します。


$ sudo systemctl start mayu




ステータスを表示していみると、ちゃんと起動していますね。


$ sudo systemctl status mayu
● mayu.service - mayu daemon
Loaded: loaded (/etc/systemd/system/mayu.service; enabled; vendor preset: ena
Active: active (running) since 日 2016-11-06 16:46:24 JST; 9s ago
Main PID: 17350 (mayu)
CGroup: /system.slice/mayu.service
         └─17350 /usr/local/bin/mayu

11月 06 16:46:24 baranche systemd[1]: Started mayu daemon.
11月 06 16:46:25 baranche mayu[17350]: loading: /home/baranche/.mayu
11月 06 16:46:25 baranche mayu[17350]: loading: /usr/local/share/mayu/linux109.
11月 06 16:46:27 baranche mayu[17350]: successfully loaded.




init.dよりもお手軽になりました。



【参考URL】

Systemdを使ってさくっと自作コマンドをサービス化してみる
systemdについて調べたメモ
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/11/06(日) 23:03:58|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Debian 8 + NginxでPAMを使用した認証

NginxでBasic認証を試してみました。
Debian 8 + NginxでBasic認証の設定

この環境で、PAMによる認証を試してみます。


PAM認証の設定



こちらを参考にしました。
Nginx with PAM Authentication
ngx_http_auth_pam_module


簡単な例として、Debianのログインパスワードで認証してみます。

まず、nginxを実行しているwww-dataがパスワードファイルを触る権限が必要でした。
shadowグループに追加します。


# usermod -a -G shadow www-data




続いてnginxの設定ファイルを編集。


# vi /etc/nginx/sites-available/default




サンプルに従い、locationセクションを変更します。


    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        auth_pam "Secure Zone";
        auth_pam_service_name "nginx";
    }




auth_pam_service_nameは、/etc/pam.d/にあるファイル名を指定するようなのですが、
nginxというファイルを作成しなくても認証が行えました。

nginxを再起動して、設定を反映します。


# service nginx restart




ブラウザでアクセスすると認証画面が表示されます。

720_01.png


Debianサーバーに存在するユーザーとパスワードを入力すると

720_02.png


認証を通過できました。

720_03.png



【参考URL】

Nginx with PAM Authentication
ngx_http_auth_pam_module

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/10/13(木) 22:27:19|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Debian 8 + NginxでBasic認証の設定

Debian 8にNginxをインストール。
Basic認証でサイトにパスワードを設定してみようと思います。


nginx-extrasのインストール



後々、他の認証方法も試してみたいので、nginx-extrasをインストールしました。
Luaモジュールなども合わせてビルドしているバージョンです。
パッケージ: nginx-extras (1.6.2-5+deb8u2 など)

Basic認証するだけなら、apt-get install nginxで問題ないと思います。
パッケージ: nginx-light (1.6.2-5+deb8u2 など)



# apt-get install nginx-extras



インストールできました。

719_01.png




Basic認証



こちらを参考にさせていただきました。
nginxでベーシック(Basic)認証を設定する方法

.htpasswdファイルを作るためだけにapache2-utilsインストールするのはちょっと...
と思ったので、適当なジェネレーターで作成することにしました。

htpasswdジェネレータ

アルゴリズムはMD5を選択しています。
ちなみに負荷逆なハッシュなので、生成される文字列は毎回異なります。

719_02.png


.htpasswdファイルを作成。


# vi /etc/nginx/.htpasswd




ジェネレーターで生成した文字列を記載します。


symfo:$apr1$po.J0lTi$WMnr7BBMtAPt3ZV2T2WHW0





次に、ngixの設定ファイルを編集します。


# vi /etc/nginx/sites-available/default





今回は全体に認証をかけてみようと思います。
locationの項目に移動。


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }




こんな感じで、
auth_basicに名称。
auth_basic_user_fileに作成したパスワードファイルのパスを指定します。


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                auth_basic "Basic Authentication Test";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }




記載が終わったら、nginxを再起動します。


# service nginx restart




再度ページを表示しようとしたら、ユーザーIDとパスワードの入力を求められました。

719_03.png


ジェネレーターに入力したIDとパスワードを入力すればページが認証を通過できます。


719_04.png


auth_basicで指定した文字列は、Google Chromeでは表示されませんでしたが、
Firefoxだとダイアログに表示されました。

719_05.png





ユーザーの追加



ユーザーを追加したい場合は、.htpasswdファイルに追記すればOKです。


symfo:$apr1$po.J0lTi$WMnr7BBMtAPt3ZV2T2WHW0
symfo2:$apr1$hjlAeIUs$c/jtYIYwLsKC0TFTCt..T.




これでsymfo2というユーザーが追加できました。

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/10/12(水) 22:59:35|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ