mellonを使ったapache2でFlaskを動かす

はじめに

前回の続きです。
apache2のmellonモジュールを使ってSSOを実装しました。認証先はAzureADです。
それはそれとして独自LDAPの操作をWeb画面で行いたいので、LDAP操作ができる言語でWebサービスを作っていきます。特にこだわりはありませんが今回はPythonでFlaskを使おうと思います。
LDAP操作は一度置いといて、apache2でwsgiモジュールを有効にしてFlaskで作ったページを表示することが今回の目標です。

1. 必要な機能のインストール

historyを見たら、以下をインストールしていました。

apt -y install python3-pip python3.11-venv libsasl2-dev python-dev-is-python3 libssl-dev libapache2-mod-wsgi-py3

2. Flaskの簡易ページ作成

pipでFlaskをインストールしようとしましたが、なにやらエラーが表示されました。 PEP668という定義があるようで、 このページが大変参考になりました。

以下のようなざっくり理解です。
「OSや他のアプリのPython環境に影響が出ないよう、仮想化した環境でモジュールを利用しよう」

仮想環境の作成

作業場所は/var/www/htmlです。ここでFlaskを動かしたいので仮想環境を作ります。
環境変数のProxy設定を忘れていたので、まずはProxyを設定します。

export http_proxy="http://10.24.1.10:8080/"
export https_proxy="http://10.24.1.10:8080/"

隔離されたPython環境(仮想環境)を作るコマンドです。
--promptは仮想環境の名前です。

python3 -m venv --system-site-packages --clear --prompt "your-ldap" --upgrade-deps $(pwd)/.venv

仮想環境ができたか確認します。

/var/www/html# ls .venv/bin/
activate  activate.csh  activate.fish  Activate.ps1  pip  pip3  pip3.11  python  python3  python3.11

/var/www/html#
モジュールのインストール

まず仮想環境を起動します。

/var/www/html# source .venv/bin/activate
(your-ldap)/var/www/html#

必要なモジュールをインストールします。

(your-ldap)/var/www/html# pip3 install flask --proxy="http://10.24.1.10:8080/"
(your-ldap)/var/www/html# pip3 install mod_wsgi --proxy="http://10.24.1.10:8080/"

仮想環境を終了します。

(your-ldap)/var/www/html# deactivate
/var/www/html# 
テスト用のファイル作成

/var/www/htmlに2つファイルを作成します。
adapter.wsgi

# coding: utf-8
import sys
sys.path.insert(0, '/var/www/html')
from app import app as application

app.py

# coding: utf-8
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Flask!"

if __name__ == "__main__":
    app.run()

3. apache2のモジュール設定

/etc/apache2/sites-enabled/server-ssl.confに設定を追加します。

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        DocumentRoot /var/www/html
        ServerSignature Off
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        LogLevel info ssl:warn
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/server.pem
        SSLCertificateKeyFile /etc/ssl/private/server.key

+        WSGIDaemonProcess your-ldap threads=5
+        WSGIScriptAlias / /var/www/html/adapter.wsgi
+        WSGIApplicationGroup %{GLOBAL}
    </VirtualHost>
+    <Directory />
+        WSGIProcessGroup your-ldap
+        WSGIApplicationGroup %{GLOBAL}
+        Order deny,allow
+        Allow from all
+    </Directory>
    <Location />
        Require valid-user
        AuthType "Mellon"
        MellonEnable "auth"
        MellonDecoder "none"
        MellonVariable "cookie"
        MellonSecureCookie On
        MellonUser "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
    </Location>
</IfModule>

systemctl restart apache2apacheを再起動します。

4. 接続確認

無事、Azureの認証経由でFlaskの画面が表示できました。

さいごに

次回はSAMLのユーザ情報の取得と表示、LDAP操作を実践してみたいと思います。