RDS for Oracle 12c Release 2 (12.2) で発生する ORA-28040 を回避する

AWS運用自動化サービス「Cloud Automator」

CS課佐竹です。
久しぶりに Oracle DB(オラクルデータベース) のエラー対応について記載します。

はじめに

2019年11月20日、以下のリリースが発表されました。本日はこのリリースがどういうシーンで役に立つのか記載します。

Amazon RDS for Oracle now supports ALLOWED_LOGON_VERSION_SERVER and ALLOWED_LOGON_VERSION_CLIENT sqlnet.ora Parameters

https://aws.amazon.com/about-aws/whats-new/2019/11/amazon-rds-for-oracle-now-supports-allowed-logon-version-server-and-allowed-logon-version-client-sqlnet-ora-parameters/

ORA-28040: 一致する認証プロトコルがありません

RDS for Oracle のバージョン 12c Release 2 (12.2) に接続を試みようとすると以下のエラーが発生する場合があります。

ORA-28040: 一致する認証プロトコルがありません

このエラーはOracle業界では(おそらく)比較的有名なエラーで、Oracleの公式サイトにも説明があります。

12.2:12より小さいバージョンのクライアントでORA-28040の後にORA-1017が発生します (Doc ID 2423805.1)

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2423805_1.html

上記の記事より引用します。

これは、12c以降のインスタンスでよく発生する問題です。 この場合、サーバー側のsqlnet.oraファイルに SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10または11を設定することで、ORA-28040を簡単に解決できます。
注意すべき点としては、12.2サーバーでは、このパラメーターのデフォルト設定が、バージョン12.1の11から変更されていることです。
バージョン12.2のデフォルト値は 「12」になっております。したがって、12.1に接続可能であったクライアントは、12.2 へバージョンアップ後、接続が失敗します。

この文章の通り RDS for Oracle で Oracle のバージョンを 12.2 でご利用されている場合に、「SQLNET.ALLOWED_LOGON_VERSION_SERVER」がデフォルト値「12」になっているため、 Oracle Client 11g 等古いバージョンのオラクルクライアントから接続ができなくなってしまう、という状況になります。

補足:発生するエラーですが「ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。」 のみが発生する場合もあるようです。

回避策

解決に必要な対応はドキュメントに記載があります通り「SQLNET.ALLOWED_LOGON_VERSION_SERVER = 10または11を設定」することになりますが、RDS for Oracle においてこのパラメータグループの設定値は、Modifiable が false となっており、変更ができませんでした。つまり回避策が封じられている状態でした。

ですが、先に紹介しましたリリースにより2019年11月20日以後は RDS for Oracle におきましても「SQLNET.ALLOWED_LOGON_VERSION_SERVER」が変更可能となりました!この変更は既に公式ドキュメント(英語版)にも反映されており、以下のリンク先にて確認頂けます。項目は「sqlnetora.sqlnet.allowed_logon_version_server」となります。

Amazon Relational Database Service (RDS) » User Guide » Oracle on Amazon RDS » Modifying a DB Instance Running the Oracle Database Engine

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ModifyInstance.Oracle.html#USER_ModifyInstance.Oracle.sqlnet

マネジメントコンソールから確認

合わせて実際にパラメータグループを確認してみました。

Modifiable が true となっており、変更が可能なことがわかります。また、Apply typeは「dynamic」になっているため、再起動が不要で即時設定が反映されるパラメータになっています。

参考情報

パラメータに関して詳しく知りたいという方のために、Oracleの公式ドキュメントのリンクを紹介いたします。

5.2.23 SQLNET.ALLOWED_LOGON_VERSION_SERVER

https://docs.oracle.com/cd/E96517_01/netrf/parameters-for-the-sqlnet-ora-file.html#GUID-1FA9D26C-4D97-4D1C-AB47-1EC234D924AA

まとめ

今回の記事では、RDS for Oracle 12c Release 2 (12.2) で発生する ORA-28040 を回避するために、「sqlnetora.sqlnet.allowed_logon_version_server」がパラメータグループで変更可能となった点について説明させて頂きました。

これは余談ですが、今年の8月末に本エラーの対応がちょうど発生しており、調査をしたところ「設定ができない」ことが判明していましたため、「変更ができたらいいな」と思っていたところでした。以下に、8月末にAWSサポートから受け取った内容の一部を紹介します。

これらのパラメータはセキュリティ上の理由により現在は設定を許可しておりません。
しかしながら、このパラメータについて変更を行いたいというご要望について多数頂いておりますことを開発部署も含めて認識しております。

もしかしたらリクエストがAWSに届いたのかもしれませんね。

最近 Savings Plans の記事ばかり書いていたので、たまにはRDSのお話でした。
ではまたお会いしましょう。

AWS運用自動化サービス「Cloud Automator」