Transactd セキュリティ
Transactdのクライアント認証には2つの方式があります。
- ホスト認証(デフォルト)
- ユーザーとホストの組み合わせ認証
ユーザー名とホストの登録やアクセス権の設定は、MySQLコマンドラインクライアントとTransactdで行う方法の2つがあります。ここではMySQLコマンドラインクライアントを使った方法で説明をします。
ホスト認証
クライアントホストのIPアドレスでアクセス可否の認証を行います。ユーザー名とパスワードは使用しません。
ホスト認証はデフォルトの認証方式です。my.cnfに何も設定を行わないか、transactd_auth_type=""
と指定した場合、この認証方式が使用されます。
アクセスを許可するホストの指定
ホストの指定は、MySQLのコマンドラインクライアントから以下のようにコマンドを実行します。
CREATE USER root@192.168.0.10, root@192.168.0.11;
GRANT USAGE ON *.* TO root@192.168.0.10, root@192.168.0.11;
上記の例では、192.168.0.10
と192.168.0.11
の2つのアドレスからのアクセスを許可します。
ユーザー名root
は代理ユーザー名です。MySQLのGRANT
文はユーザー名@ホスト名
の形式で指定するため、代理ユーザー名を使用します。
代理ユーザー名はデフォルトでroot
が使用されます。これを変更する場合は、my.cnfにtransactd_hostcheck_username="username"
のように指定することができます。
なお、ホスト名(例:host.domain.com
)による指定は行えません。DNSルックアップによる遅延や失敗を防止します。
アドレス範囲での指定
アドレスの範囲(クラスA/B/Cのいずれか)で指定することもできます。
CREATE USER root@'192.168.0.0/255.255.255.0';
GRANT USAGE ON *.* TO root@'192.168.0.0/255.255.255.0';
クラスCの場合は、クラスCのアドレスに続いて.0/255.255.255.0
を付加します。クラスBでは.0.0/255.255.0.0
、クラスAは.0.0.0/255.0.0.0
を付加します。クラスCより狭い範囲192.168.0.0/255.255.240.0
といった指定は行えません。
%
によるワイルドカード方式での指定も可能です。クラスCは192.168.0.%
、クラスBは192.168.%
、クラスAは10.%
のように指定します。これらはMySQLのユーザー作成ルールと同様です。
アクセス権限
ホスト認証では、接続の可否のみを制限します。データベースやテーブルに対するオペレーションの可否を制限することはできません。接続を許可されたホストはすべての機能を利用する権限を有します。
ユーザーとホストの組み合わせ認証
ユーザーとホストの組み合わせ認証は、MySQLのnative_passwordと互換性があります。MySQLのクライアント用に設定されたユーザー名とパスワードがそのままTransactdで使用できます。
my.cnfにtransactd_auth_type="mysql_native"
と指定した場合、この認証方式が使用されます。
接続が許可されたクライアントは、そのユーザーに設定されたアクセス権限の範囲内でデータの処理を行うことができます。
接続時のユーザー名とパスワードの指定
ユーザー名とパスワードの指定が可能なのは、接続と同時に行われるnsdatabase::connect()
nsdatabase::create()
nsdatabase::open()
の3つのAPIです。それぞれURIの指定パラメータで以下のように指定します。
tdap://ユーザー名@server/database?dbfile=schema&pwd=パスワード
アクセス権限
アクセス権限についても、MySQLのそれとほとんど同様です。詳細はMySQLのマニュアルを参照してください。ただし、Transactdにはない機能(トリガーなど)はすべて無視されます。また、フィールドごとのアクセス権限は現在のところ使用されていません。
権限テーブル
アクセス権限は、mysql.user
(グローバル)、mysql.db
(データベース)、mysql.tabels_priv
(テーブル)の各テーブルに設定された値をORで演算したものになります。
グローバル、データベース、テーブルの別はdatabase.table
形式の表記のワイルドカード指定で行います。GRANT ON
のあとの指定でそれぞれ、*.*
database.*
database.table
の3種類の指定方法で行います。
たとえば、データベースごとにアクセスできるユーザーを制限したい場合は、mysql.user
のテーブルアクセスに関するグローバル権限は無効にしてmysql.db
にそのユーザーのアクセス権を設定します。
CREATE USER username@host IDENTIFIED BY 'set_your_password';
GRANT USAGE ON *.* TO username@host;
GRANT ALL PRIVILEGES ON databasename.* TO username@host;
権限の設定変更が有効になるタイミング
アクセス権限はサーバー内部でキャッシュされています。設定内容を変更した場合に有効になるタイミングは以下のようになります。
mysql.user
(グローバル)データベースをオープンしたときmysql.db
(データベース)データベースをオープンしたときmysql.tabels_priv
(テーブル)テーブルをオープンしたとき
たとえば、グローバルのアクセス権を変更した場合、それが有効になるのは、それ以降にオープンしたデータベースからです。既にオープンされていたデータベースには反映されません。