- Oracle Cloud
- Oracle Database
OCIでGPUインスタンスを構築してみた
OCIで提供されている生成AIサービスとGPUインスタンスを前回の記事「生成AIにGPUが適している理由」で紹介しました。本記事では、GPUインスタンスをデプロイして、インスタンス上でLLM(大規模言語モデル)の動作環境を構築する方法をご紹介します。
|
Oracle Database 23aiにおけるセキュリティ強化の一環として、SQLファイアウォールが登場しました。
この機能は、データベースに対する不正アクセスを検知/ブロックするためのものです。不正アクセスの代表的なものに、SQLインジェクションなどの不正なSQL文による攻撃や本来許可されていない接続元からのアクセスがあります。こうした不正アクセスを検知し、ブロックすることでデータベースの安全性を高めます。
従来、データベース観点でのSQLインジェクション対策としては権限制御などがありましたが、SQLファイアウォールを導入することでより詳細かつ厳密な制御が可能になりました。
本ブログではSQLファイアウォールについて、使用例とあわせてご紹介します。
Index
SQLファイアウォールは許可リスト制のファイアウォールです。
ユーザーごとにあらかじめ許可されたSQLコマンドのみを実行できるよう制御することで、不正アクセスやSQLインジェクション攻撃を防ぐことが可能です。
許可リストにないSQLが実行されると「ORA-47605: SQLファイアウォール違反」エラーが発生します。
また、エラーを発生させずに監視履歴を残すのみという設定も可能です。
SQLファイアウォールを使用するためには、大きく3つの手順があります。
SQL_FIREWALL_ADMIN権限を持つ管理ユーザーにてDBMS_SQL_FIREWALL.ENABLE プロシージャを実行することで、SQLファイアウォールが使用可能になります。
-- 権限付与
SQL> conn system/oracle@PDB1
接続されました。
SQL> grant SQL_FIREWALL_ADMIN to USER1;
権限付与が成功しました。
-- 有効化
SQL> conn USER1/USER1@PDB1
接続されました。
SQL> EXEC DBMS_SQL_FIREWALL.ENABLE;
PL/SQLプロシージャが正常に完了しました。
SQLファイアウォールでは、特定期間に実行されたSQLをOracle Databaseがキャプチャし、それを元に自動的に許可リストが作成されます。
DBMS_SQL_FIREWALL.CREATE_CAPTURE プロシージャを管理ユーザーが実行すると、Oracle Databaseによるキャプチャの取得が開始されます。
取得したキャプチャは DBA_SQL_FIREWALL_CAPTURE_LOGS ビューから確認可能です。
-- キャプチャの作成と取得開始
SQL> BEGIN
2 DBMS_SQL_FIREWALL.CREATE_CAPTURE (
3 username => 'USER1',
4 top_level_only => TRUE,
5 start_capture => TRUE -- 作成と同時にキャプチャも開始
6 );
7 END;
8 /
PL/SQLプロシージャが正常に完了しました。
-- 許可するSQLを実行
SQL> SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE
2 WHERE EMPNO = 1;
EMPNO EMPNAME ADDRESS
---------- ---------- --------------------
1 佐藤 XX県XX市XXX1-2-3
-- キャプチャの取得終了
SQL> EXEC DBMS_SQL_FIREWALL.STOP_CAPTURE('USER1');
PL/SQLプロシージャが正常に完了しました。
-- 取得したキャプチャの確認
SQL> SELECT IP_ADDRESS, SQL_TEXT
2 from DBA_SQL_FIREWALL_CAPTURE_LOGS;
IP_ADDRESS
------------------------------------------------
SQL_TEXT
--------------------------------------------------------------------------------
172.16.60.63
SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE WHERE EMPNO=:"SYS_B_0"
キャプチャされたSQLはOracle Databaseにより標準化が行われ保存されます。
例えばSQLにwhere句が用いられていた場合には、where句で指定された値がバインド変数に自動的に置き換えられます。
この標準化により、where句を使用したSQLは特定の値の絞り込みが行われた場合だけではなく、同じ構造の文であれば別の条件値が選択された場合でも許可されるポリシーが作成されます。
キャプチャされたSQL
SELECT ~ WHERE EMPNO = 1;
保存されるSQL
SELECT ~ WHERE EMPNO = "SYS_B_0" – WHERE条件値が標準化される
○ 許可されるSQL
SELECT ~ WHERE EMPNO = 3; – WHERE句で指定する値だけが違う
✕ 許可されないSQL
SELECT ~ WHERE EMPNO = 1 or 1 = 1; – 文の構造が異なる
次に、DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST プロシージャを実行し、キャプチャから許可リストを作成します。
作成した許可リストは、DBMS_SQL_FIREWALL.ENABLE_ALLOW_LISTプロシージャで有効化します。
許可リスト外の操作が行われた場合の対応は次の2つから選択できます。
許可リスト外の操作への対応
ENABLE_ALLOW_LISTプロシージャの block 引数値により、SQLファイアウォール違反時の結果が次のように異なります。
block引数 | 許可リスト外の操作結果 | 用途 |
---|---|---|
TRUE | ORA-47605: SQLファイアウォール違反 エラーとなる | ファイアウォール |
FALSE | エラーにはならずSQLが実行されるがDBA_SQL_FIREWALL_VIOLATIONS にログが残る | 監査 |
-- 取得したキャプチャから許可リストを作成
SQL> EXEC DBMS_SQL_FIREWALL.GENERATE_ALLOW_LIST ('USER1');
PL/SQLプロシージャが正常に完了しました。
-- 許可リストの有効化
SQL> BEGIN
2 DBMS_SQL_FIREWALL.ENABLE_ALLOW_LIST(
3 username=>'USER1',
4 enforce=>DBMS_SQL_FIREWALL.ENFORCE_ALL,
5 block=>TRUE -- 許可リスト外の操作はエラーで返す
6 );
7 END;
8 /
PL/SQLプロシージャが正常に完了しました。
なお許可リストは直接編集することはできませんが、DBMS_SQL_FIREWALL.DELETE_ALLOWED_SQLプロシージャを実行して特定 SQLを許可リストから削除するなど、管理ユーザーによる一部修正は可能です。
-- 許可リストから特定SQLを削除
-- 現在の許可リストを確認
SQL> SELECT ALLOWED_SQL_ID, USERNAME, SQL_TEXT FROM DBA_SQL_FIREWALL_ALLOWED_SQL;
ALLOWED_SQL_ID
--------------
USERNAME
--------------------------------------------------------------------------------
SQL_TEXT
--------------------------------------------------------------------------------
2
USER1
SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE WHERE EMPNO=:"SYS_B_0"
3
USER1
SELECT * FROM TABLE_A -- 削除対象のSQL
PL/SQLプロシージャが正常に完了しました。
-- 不要SQLの削除
SQL> BEGIN
2 DBMS_SQL_FIREWALL.DELETE_ALLOWED_SQL (
3 username => 'USER1',
4 allowed_sql_id => 3 -- 削除対象のALLOWED_SQL_IDを指定
5 );
6 END;
7 /
PL/SQLプロシージャが正常に完了しました。
-- 許可リストから TABLE_A を参照する SQL が消えていることを確認
SQL> SELECT ALLOWED_SQL_ID, USERNAME, SQL_TEXT FROM DBA_SQL_FIREWALL_ALLOWED_SQL;
ALLOWED_SQL_ID
--------------
USERNAME
--------------------------------------------------------------------------------
SQL_TEXT
--------------------------------------------------------------------------------
2
USER1
SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE WHERE EMPNO=:"SYS_B_0"
ここまでは SQLファイアウォールの設定方法についてご案内しました。
この機能の使用シーンとして次の2点をご紹介します。
・SQLインジェクション対策
・不正クライアントからのアクセス対策
SQLインジェクションとは、ウェブサイトの入力欄に特別なコードを入れることで、権限外のデータを参照、変更する攻撃方法です。
例えば入力値に応じて employee表のアクセスする処理があった際に
通常は、select * from employee where empno = 3; などと実行しますが、
select * from employee where empno = 3 or 1=1; と実行することで
employee列の全ての行を参照できてしまいます。
当初の想定とは異なる結果が呼び出されることで、情報漏洩などのセキュリティリスクとなるため対応が必要です。
SQLファイアウォールは許可リスト制のファイアウォールです。
特定 SQL以外の実行を拒否することができるため、SQLインジェクションの対策として効果的です。
-- 許可リストにない SQL を実行するとエラーになる
SQL> SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE
2 WHERE EMPNO = 3 or 1 = 1;
SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE
*
行1でエラーが発生しました。:
ORA-47605: SQLファイアウォール違反 ヘルプ:https://docs.oracle.com/error-help/db/ora-47605/
block引数をTRUEとしている場合、上記のようにエラーが発生します。
許可リスト外のSQLやセッションの情報は、DBA_SQL_FIREWALL_VIOLATIONS ビューに履歴が残ります。
-- 既定のSQL以外が実行されたことを示す違反ログ
SQL> SELECT USERNAME, SQL_TEXT, CAUSE from DBA_SQL_FIREWALL_VIOLATIONS;
USERNAME
----------
SQL_TEXT
----------------------------------------------------------------------------------------------------
CAUSE
--------------------
USER1
SELECT EMPNO,EMPNAME,ADDRESS FROM EMPLOYEE WHERE EMPNO=:"SYS_B_0" OR :"SYS_B_1"=:"SYS_B_2"
SQL violation -- 許可リストにないSQLが実行されたため違反となった
不正クライアントからのアクセスは、データベースに対する重大な脅威です。
不正クライアントによりアクセスすべきではない情報にアクセスされることで、データの機密性、完全性、可用性が損なわれる恐れがあります。
この脅威に対応するため、アクセス制御が不可欠です。
SQLファイアウォールは、SQLだけでなく、接続元のOSユーザーやIPアドレスも監視します。
あらかじめ定めたクライアント以外からアクセスがあった場合、接続を拒否したりログとして残すことができます。
-- 既定の接続元情報(コンテキスト)以外からの接続が行われたことを示す違反ログ
SQL> SELECT USERNAME, IP_ADDRESS, CAUSE FROM DBA_SQL_FIREWALL_VIOLATIONS;
USERNAME IP_ADDRESS CAUSE
------------ ------------------ ------------------
USER1 172.16.60.179 Context violation
なお、アプリケーションの改修などにより、正しい接続元情報が増えた場合などは、DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT プロシージャーを実行することで許可リストに情報を追加できます。
-- IPアドレス 172.16.60.179 を許可リストに追加
SQL> BEGIN
2 DBMS_SQL_FIREWALL.ADD_ALLOWED_CONTEXT(
3 username => 'USER1',
4 context_type => DBMS_SQL_FIREWALL.IP_ADDRESS,
5 value => '172.16.60.179');
6 END;
7 /
PL/SQLプロシージャが正常に完了しました。
-- IPアドレス 172.16.60.179 が許可リストに追加されたことを確認
SQL> SELECT * FROM DBA_SQL_FIREWALL_ALLOWED_IP_ADDR;
USERNAME IP_ADDRESS
---------- --------------------
USER1 127.0.0.1
USER1 172.16.60.179 ★追加された
USER1 172.16.60.63
Oracle Database 23aiの様々な機能の中で、データ保護に特化したSQLファイアウォールをご紹介しました。
近年セキュリティ要件が厳格化し、特定の接続元からのみ許可された操作を認めたいといったホワイトリスト方式の制御が求められる機会が増えてきました。
ホワイトリスト方式のセキュリティでは非常に堅牢な制御を行うことができる一方で、リストの作成コストが大きい点が問題視されます。
この課題に対し、Oracle Database 23aiのSQLファイアウォールでは、実行されているSQLコマンドをキャプチャし、それらを許可リストに反映させることができます。0から許可リストを作成する必要がないため、リストの作成コストを大幅に削減できます。
一方で、このようにファイアウォールを作成する工数は削減されるため作りやすくなりますが、その後の管理が必要です。一度作成した許可リストはシステム変更や組織変更にあわせて都度アップデートしていくことがセキュリティ対策の鍵です。
その管理工数を考えると、全てのデータにファイアウォールを設定することは現実的ではないかもしれませんが、特に厳密な管理が求められるデータを保護するためのツールとして、SQLファイアウォールの使用をご検討いただけますと幸いです。
2019年に新卒入社。Oracle Databaseの技術部門に配属後、サポートやフィールドエンジニアとして活動。 Oracle Databaseの教育講師も兼任しており、SQLやPL/SQLなど言語系の講義を担当する。
■本記事の内容について
本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。
■商標に関して
・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
文中の社名、商品名等は各社の商標または登録商標である場合があります。
OCIで提供されている生成AIサービスとGPUインスタンスを前回の記事「生成AIにGPUが適している理由」で紹介しました。本記事では、GPUインスタンスをデプロイして、インスタンス上でLLM(大規模言語モデル)の動作環境を構築する方法をご紹介します。
前回の記事でお伝えしたとおり、OCVSを構築するとVMwareの複数の機能が利用可能です。 それらの機能の中で、今回はHCXの概要や具体的な機能、OCVSでHCXを利用するメリットなどをお伝えします!
2024年5月にOracle Cloud環境にて、先行してOracle DB 23aiがリリースされました。 Oracle Base Database ServiceにおけるOracle Database 23aiの検証結果を報告します。 今回は「統合メモリー管理」をテーマにお伝えします。