2022年6月14日火曜日

SAML認証で使用したデバッグ手順

 SAML認証のデバッグで使用した、いくつかの手順を紹介します。


公開鍵証明書の確認



SAMLの認証スキームの編集画面より、証明を登録したときに証明書が無効ですと表示されれることがあります。



証明書の貼り付け方に問題があるのか(コピペミスなど)、または証明書自体に問題があるのか、このメッセージだけでは特定が難しいです。openssl x509 -textを実行することで、証明書の内容が確認できている場合は、さらに難しいです。

openssl x509 -in 公開鍵証明書ファイル -text -noout

マニュアルには記載されていませんが、Oracle APEXで扱う公開鍵証明書を検証するファンクションがあります。WWV_FLOW_PUBLIC_KEY_UTIL.IS_CERTIFICATEです。公開鍵証明書を文字列として受け取り、証明書として正しければTRUE、そうでなければFALSEを返します。

このファンクションを使った検証スクリプトの雛形です。


opensslではパースできるのに、上記でFALSEとなる(Certificate is NOT valid.が印刷される)場合は、Oracle APEXが提供しているファンクションを使って、証明書がパースできるかどうか確認します。WWV_FLOW_PUBLIC_KEY_UTIL.PARSE_CERTIFICATEを使います。

このファンクションを使った検証スクリプトの雛形です。


スクリプトの実行にあたっては、事前にAPEXのスキーマをCURRENT_SCHEMAに設定します。

APEX 22.1の場合は、APEX_220100がAPEXがインストールされているスキーマになります。

alter session set current_schema = APEX_220100;

残念ながらAutonomous Databaseでは、APEXのスキーマは保護されています。そのため、内部で使用するパッケージに含まれるプロシージャやファンクションを呼び出すことはできません。オンプレの環境を用意する必要があります。

正常に実行されると、以下のように表示されます。

SQL> alter session set current_schema = apex_220100;


Session altered.


SQL> @verify-cert

Certificate is valid.


PL/SQL procedure successfully completed.


SQL> @parse-cert

cert_sig_algorithm = c_sha256_rsa

key_algorithm = RSA

key_length = 2048


PL/SQL procedure successfully completed.


SQL> 



HARファイルの確認



ORDSへ送信されるOriginヘッダーの内容は、HARをエクスポートして確認しています。

ChromeまたはEdgeを例に取ります。ブラウザの開発者ツールを実行し、ネットワークを開きます。

最初に、それまでの記録をクリアします。


レコード・ボタンをクリックして、ネットワーク・ログの記録を開始します。記録中は、ボタンが赤くなります。


ネットワーク・ログを記録するURLにアクセスします。


記録したデータを、ファイルにダウンロードします。


レコード・ボタンをクリックし、レコーディングを停止します。


ダウンロードしたファイルの内容を確認します。

HTTPヘッダーなどの情報を確認することができます。



ブラウザごとに操作に違いがあります。使用しているブラウザでのHARの取得方法を確認しましょう。


d0、d1、d2スクリプトの使用



SAMLコールバックのデバッグ・メッセージを取得するには、インスタンス全体でデバッグを有効にする必要があります。

このためにAPEXのダウンロード・メディアのapex/utilities/debug以下に配置されているd0.sqlを使用します。

APEXのデータベースに、sysまたはsystemで接続し、CURRENT_SCHEMAをAPEXのスキーマに設定します。続いてd0.sqlを実行します。デバッグ・レベルが9、つまり完全トレースになります。APEX全体への影響が大きいため、本番環境での実施には特別な注意が必要です。

SQL> alter session set current_schema = apex_220100;


Session altered.


SQL> @d0

Changed debug level from "" to "9"

SQL> 


SAMLのサインインを実施します。


再度d0.sqlを実行し、デバッグ・メッセージの取得を停止します。

SQL> alter session set current_schema = apex_220100;


Session altered.


SQL> @d0

Changed debug level from "" to "9"

SQL> @d0

Changed debug level from "9" to ""

SQL> 


d1.sqlを実行し、直近のAPEXへのアクセスを一覧します。

PAGE_VIEW_ID  STARTED  SECS   LVL  COUNT PATH_INFO       APP:PAGE SESSION_ID   WORKSPACE USER

------------- -------- ------ --- ------ ---------------------------- ---------- --------------------------------- -------------------- --------------------------------


@d2 8003      06:00:00 0.03       16 DBMS_SCHEDULER/ORACLE_APEX_M 0   Unknown

AIL_QUEUE


@d2 8004      06:00:00 0.01       5 DBMS_SCHEDULER/ORACLE_APEX_W 0   Unknown

S_NOTIFICATIONS


@d2 8005      06:00:02 0.01       9 DBMS_SCHEDULER/ORACLE_APEX_P 0   Unknown

URGE_SESSIONS


@d2 8006      06:00:10 0.20 WRN    220 show       4500:1000  0-16849648434733   INTERNAL nobody


PAGE_VIEW_ID  STARTED  SECS   LVL  COUNT PATH_INFO       APP:PAGE SESSION_ID   WORKSPACE USER

------------- -------- ------ --- ------ ---------------------------- ---------- --------------------------------- -------------------- --------------------------------

@d2 8007      06:00:11 0.72     1610 show       4550:1 0-16849648434733   INTERNAL nobody

@d2 8618      06:00:24 0.18 WRN    315 show       102:1 0-9657959965886   APEXDEV nobody

@d2 8619      06:00:43 0.36 WRN    508 ajax plugin       102:1 0-9657959965886   APEXDEV nobody


30 rows selected.


SQL> 


アプリケーションIDやページIDなどを参照して、確認すべきページ・ビューIDを特定します。SAMLコールバックのPATH_INFOajax pluginになります。

上記の例では@d2 8619より、SAMLコールバックのデバッグ・メッセージを確認することができます。

SQL> @d2 8619


デバッグ・メッセージが手元のファイルにダウンロードされ、エディタが開きます。


詳細なデバッグ・メッセージを参照できます。通常は、このデータをファイルに保存してオラクルのサポートに提出することになるでしょう。


画面へのエラー詳細表示


ORDSのプロパティdebug.printDebugToScreentrueにすると、ブラウザの画面にエラーの詳細が表示されます。マニュアルのこちらに説明があります。

debug.printDebugToScreenがfalse(デフォルト)のときに、ORDSでエラーが発生した画面です。


ORDS 22.1にて、上記のプロパティをtrueにする方法です。ordsコマンドのパスおよび構成ファイルが含まれるディレクトリは、インストール毎に異なります。

/usr/local/bin/ords --config /etc/ords/config config set debug.printDebugToScreen true

[oracle@apex ~]$ /usr/local/bin/ords --config /etc/ords/config config set debug.printDebugToScreen true


ORDS: Release 22.1 Production on Tue Jun 14 04:39:29 2022


Copyright (c) 2010, 2022, Oracle.


Configuration:

  /etc/ords/config/


The global setting named: debug.printDebugToScreen was set to: true

[oracle@apex ~]$ 


変更を有効にするには、ORDS(またはTomcat)を再起動する必要があります。

ORDS 21.4.3以前では、以下のコマンドを実行します。

java -jar ords.war set-property debug.printDebugToScreen true

[oracle@ords ords]$ java -jar ords.war set-property debug.printDebugToScreen true

2022-06-14T04:45:10.789Z INFO        Modified: /opt/oracle/ords/conf/ords/defaults.xml, setting: debug.printDebugToScreen = true

[oracle@ords ords]$


ORDS 221.1および21.4.3の双方で、上記のコマンドによって、設定ファイルに以下の行が書き込まれます。設定ファイルの名前はORDS 22.1ではsettings.xml、ORDS 21.xではdefaults.xmlになります。

<entry key="debug.printDebugToScreen">true</entry>

以上の変更より、エラーの詳細が画面に表示されます。


エラー発生時の詳細が画面に表示されるため、この状況での本番運用は望ましくありません。デバッグが終了したら、以下のコマンドにより設定を削除します。

/usr/local/bin/ords --config /etc/ords/config config delete debug.printDebugToScreen

[oracle@apex ~]$ /usr/local/bin/ords --config /etc/ords/config config delete debug.printDebugToScreen


ORDS: Release 22.1 Production on Tue Jun 14 05:00:18 2022


Copyright (c) 2010, 2022, Oracle.


Configuration:

  /etc/ords/config/


The global setting named: debug.printDebugToScreen was removed from the configuration

[oracle@apex ~]$ 


ORDS 21.xではエディタでdefaultsxmlを開いて、該当の設定を削除します。

変更の反映には、ORDSの再起動が必要です。

SAML認証で使用した、デバッグ手順の紹介は以上になります。