PUBLIC ユーザー・グループとは
PUBLIC とはマニュアル上では 「特別なユーザー・グループ*1」と記載されている。
CREATE PUBLIC 〜 の場合にはキーワードとして覚える方が便利かもしれないが 「PUBLIC ロール」に権限を付与する GRANT .. TO PUBLIC などを含めると PUBLIC というユーザー・グループが管理していると思った方が理解しやすい。
実際、一部の開発ツールでは PUBLIC はユーザーとして閲覧できる。しかし PUBLIC はスキーマを所有していない。
ただ、他のユーザーの スキーマ・オブジェクト のオブジェクト権限などを 全ユーザーに付与 という意味を含めて仮想的なユーザー?の位置付け(ユーザー・グループ)としては好都合な説明であると思う。
PUBLIC ロールの実行権限
以下の権限は取り扱いに注意する ( 標準設定のままでは問題になる可能性がある )
| 要注意権限 | 危険性 |
| CREATE DBLINK | リモートからデータの収集 (CONNECT ロールに含まれる、ロールからは個別に剥奪できない) |
| UTL_MAIL*2 | メールによるデータの送信(容易に添付ファイルも使用できるパッケージ)  |
| UTL_SMTP | メールによるデータの送信 |
| UTL_TCP | TCPによるデータの送信 |
| UTL_HTTP | HTMLフォームによるデータの送信 |
| UTL_FILE | ホストのファイルへのアクセス |
| DBMS_SQL | 放置カーソルによる脆弱性の内容と手法が公開された過去がある(Oracle 10g 含む) |
| DBMS_RANDOM | 不適切に初期化されることで暗号化に問題が発生する(Oracle 9i まで) |
PUBLIC からは削除し、特定のユーザーに個別に許可する。
-- SYSで実行
REVOKE EXECUTE ON UTL_SMTP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_TCP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC ;
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC ;
REVOKE EXECUTE ON DBMS_SQL FROM PUBLIC ;
REVOKE EXECUTE ON DBMS_RANDOM FROM PUBLIC ;
権限状態の確認 SQL
SELECT *
FROM
DBA_TAB_PRIVS
WHERE
PRIVILEGE = 'EXECUTE'
AND GRANTEE = 'PUBLIC'
AND TABLE_NAME IN(
'UTL_SMTP', 'UTL_TCP', 'UTL_HTTP',
'DBMS_SQL', 'DBMS_RANDOM'
) ;
ロール関連事項
PUBLIC シノニム
開発するアプリケーションにおいて パブリック・シノニム の利用は控えるようにする。
PUBLIC シノニムを抽出 (システムで定義されたものは除外)
-- ユーザー管理のシノニム
SELECT *
FROM
USER_SYNONYMS
;
-- PUBLIC シノニム
SELECT *
FROM
DBA_SYNONYMS
WHERE
OWNER = 'PUBLIC'
AND NOT TABLE_OWNER IN (
'SYS', 'SYSMAN', 'SYSTEM'
,'WMSYS', 'EXFSYS', 'ORDSYS'
,'MDSYS', 'XDB'
);
シノニム関連事項