Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MySQLとPostgreSQLにおける基本的なアカウント管理

543 views

Published on

Oracle, MS SQL, MySQLをこれまで管理してきて、
今回はPostgreSQLのアカウント管理の仕方を比較しながら整理してみた。

Published in: Software
  • Be the first to comment

  • Be the first to like this

MySQLとPostgreSQLにおける基本的なアカウント管理

  1. 1. Compared Version MySQL PostgreSQL root@localhost [mysql]> select @@version,now(); +-----------+---------------------+ | @@version | now() | +-----------+---------------------+ | 8.0.18 | 2019-11-04 01:50:06 | +-----------+---------------------+ 1 row in set (0.00 sec) postgres=# select version(); version -------------------------------------- PostgreSQL 12.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit (1 行) PostgreSQL 12 Release date: 2019-10-03 https://www.postgresql.org/docs/12/release-12.html MySQL 8.0.18 Release date: 2019-10-14 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-18.html
  2. 2. User and Remote Connection MySQL PostgreSQL root@localhost [mysql]> select Host,User,plugin from user; +-----------+------------------+-----------------------+ | Host | User | plugin | +-----------+------------------+-----------------------+ | % | appication | mysql_native_password | | localhost | mysql.infoschema | mysql_native_password | | localhost | mysql.session | mysql_native_password | | localhost | mysql.sys | caching_sha2_password | | localhost | root | mysql_native_password | +-----------+------------------+-----------------------+ -bash-4.2$ cat /var/lib/pgsql/12/data/postgresql.conf | grep listen #listen_addresses = 'localhost' # what IP address(es) to listen on; -bash-4.2$ cat /var/lib/pgsql/12/data/pg_hba.conf | grep -v ^# # TYPE DATABASE USER ADDRESS METHOD local all postgres localhost trust host all all 127.0.0.1/32 ident host testdb admin 192.168.10.0/24 md5 local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident -bash-4.2$ MySQLではDefaultではlocalhostのみからの接続が出来る アカウントが存在するが、Create Userにてhost部分をlocalhost以外 を指定する事でリモートからアクセス可能 なアカウントになる。(権限設定は,Grantで別途設定が必要) postgresql.confにてListenするIPを指定するか、"*” にする事で、 全てのインターフェースからの接続を許可する。 ホストやセグメントの指定は、pg_hba.confにて指定する。 HBA = host-based authentication クライアントIP範囲、データベース名、ユーザ名およびこれらのパラ メータに一致する接続で使用される認証方法を指定 shell> cat /var/lib/pgsql/12/data/postgresql.conf | grep hba #hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file
  3. 3. -bash-4.2$ cat /var/lib/pgsql/12/data/pg_hba.conf | grep -v ^# local all postgres trust host all all 127.0.0.1/32 ident host all all ::1/128 ident local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident host all admin 192.168.56.0/24 md5 -bash-4.2$ psql -l データベース一覧 名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権限 -----------+----------+------------------+-------------+-------------------+----------------------- postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres -bash-4.2$ psql -c "du" postgres ロール一覧 ロール名 | 属性 | 所属グループ ----------+--------------------------------------------------------------------------+-------------------------------- admin | スーパユーザ | {pg_monitor,pg_signal_backend} postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {} -bash-4.2$ psql postgres -U replication psql: エラー: サーバに接続できませんでした: FATAL:pg_hba.conf にホスト"[local]"、ユーザ"replication"、データベース"postgres, SSL無効用のエントリがありません -bash-4.2$ PostgreSQLはファイルとDBにて設定
  4. 4. 補足:pg_hba.conf 項目 概要 設定値 TYPE 接続方式 local,host,hostssl,hostnossl DATABASE 接続データベース - データベースの名前はカンマで区切ることで複数指定できます - レプリケーション接続は特定のデータベースを指定しない all,database,sameuser,samerole, replication USER 接続ユーザー - ユーザ名を含む別のファイルを、ファイル名の前に@を付け指定可能 all,ユーザ名,+グループ名, @ファイル名 ADDRESS 接続可能IPアドレス、セグメント ホスト名、IPアドレスの範囲 METHOD 認証方式 trust,reject,scram-sha-256,md5, password,gss,sspi,ident,peer, ldap,radius,cert,pam,bsd 詳細: https://www.postgresql.jp/document/10/html/auth-pg-hba-conf.html
  5. 5. MySQL PostgreSQL [mysql]> CREATE USER 'admin'@'192.168.56.0/255.255.255.0' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.01 sec) root@localhost [mysql]> select user,host from mysql.user; +------------------+----------------------------+ | user | host | +------------------+----------------------------+ | application | % | | admin | 192.168.56.0/255.255.255.0 | | admin | 192.168.10.0/255.255.255.0 | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+----------------------------+ 6 rows in set (0.00 sec) [ec2-user@ec2 ~]$ mysql -h 192.168.56.10 -u application -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 79 Server version: 8.0.18 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. postgres=# CREATE ROLE admin LOGIN; CREATE ROLE postgres=# ALTER ROLE admin WITH PASSWORD 'password'; ALTER ROLE postgres=# ALTER ROLE admin SUPERUSER; ALTER ROLE # cat /var/lib/pgsql/12/data/postgresql.conf | grep listen listen_addresses = '*' # cat /var/lib/pgsql/12/data/pg_hba.conf | grep admin host all admin 192.168.56.0/24 md5 DESKTOP-A5QLPD0:~/$ psql -h 192.168.56.104 -U admin postgres Password for user admin: psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1), server 12.0) WARNING: psql major version 10, server major version 12. Some psql features might not work. Type "help" for help. postgres=# du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- admin | Superuser | {} postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} CREATE USER コマンドでアカウントを作成 (“ユーザー名”@”ホスト”) 接続許可はユーザとパスワードだけでなく、クライアントのホストを含む ホストの指定はホスト名、IPアドレス、ワイルドカード、サブネットでの指定が可能 同一ユーザ名でも接続元ホストが異なる場合は別アカウントになる ユーザーやグループでなくロールでアクセス管理を実施するようになっています。 pgsqlでは無く、shellから直接アカウントを作成したい場合は、postgresユーザー に切り替えてから"createuser ロール名"で作成する事も可能です。 postgresql.confでListenするアドレス、pg_hba.confにて接続元を許可する設定を行います。 例: User and Remote Connection
  6. 6. ユーザ権限 MySQL (https://dev.mysql.com/doc/refman/5.6/ja/privileges-provided.html) PostgreSQL (https://www.postgresql.jp/document/11/html/sql-grant.html) $mysql -u root -p -e "desc user" mysql | grep "_priv" Select_priv enum('N','Y') NO N Insert_priv enum('N','Y') NO N Update_priv enum('N','Y') NO N Delete_priv enum('N','Y') NO N Create_priv enum('N','Y') NO N Drop_priv enum('N','Y') NO N Reload_priv enum('N','Y') NO N Shutdown_priv enum('N','Y') NO N Process_priv enum('N','Y') NO N File_priv enum('N','Y') NO N Grant_priv enum('N','Y') NO N References_priv enum('N','Y') NO N Index_priv enum('N','Y') NO N Alter_priv enum('N','Y') NO N Show_db_priv enum('N','Y') NO N Super_priv enum('N','Y') NO N Create_tmp_table_priv enum('N','Y') NO N Lock_tables_priv enum('N','Y') NO N Execute_priv enum('N','Y') NO N Repl_slave_priv enum('N','Y') NO N Repl_client_priv enum('N','Y') NO N Create_view_priv enum('N','Y') NO N Show_view_priv enum('N','Y') NO N Create_routine_priv enum('N','Y') NO N Alter_routine_priv enum('N','Y') NO N Create_user_priv enum('N','Y') NO N Event_priv enum('N','Y') NO N Trigger_priv enum('N','Y') NO N Create_tablespace_priv enum('N','Y') NO N Create_role_priv enum('N','Y') NO N Drop_role_priv enum('N','Y') NO N postgres=# SELECT rolname FROM pg_roles; rolname --------------------------- pg_monitor pg_read_all_settings pg_read_all_stats pg_stat_scan_tables pg_read_server_files pg_write_server_files pg_execute_server_program pg_signal_backend postgres postgres=# GRANT pg_signal_backend TO admin; postgres=# GRANT pg_monitor TO admin; postgres=# du ロール一覧 ロール名 | 属性    | 所属グループ ----------+---------------------------------+-------------------------------- admin | スーパユーザ | {pg_monitor,pg_signal_backend} postgres | スーパユーザ, ロール作成可 ... | {} postgres=# select oid, * from pg_authid; -[ RECORD 1 ]--+------------------------------------ oid | 3373 oid | 3373 rolname | pg_monitor rolsuper | f rolinherit | t rolcreaterole | f rolcreatedb | f <SNIP>
  7. 7. 設定反映のタイミング MySQL PostgreSQL [mysql]> CREATE USER 'application'@'192.168.56.0/255.255.255.0' IDENTIFIED BY 'password'; [mysql]> GRANT ALL PRIVILEGES ON `APP`.* TO `application`@`%`; -bash-4.2$ /usr/pgsql-12/bin/pg_ctl reload サーバにシグナルを送信しました -bash-4.2$ CREATE USER, GRANT, ALTERコマンド実行と同時にメモリー内にキャッシュされた権限設定もFlash されるので、アカウントへの設定は即時反映されます。 NOTE: ユーザーが直接テーブルのデータをINSERT、UPDATE、DELETE等で更新した場合は、 [mysql]> FLUSH PRIVILEGES;でマニュアルでメモリー内にキャッシュされた権限をFlushする 必要があります。 pg_hba.confファイルはPostgreSQL起動した時とPostgresのプロセスにSIGHUP シグナルを送信したタイミングで読み込まれます。
  8. 8. pg_hba_file_rulesによる設定確認 -bash-4.2$ psql -U postgres -c "select * from pg_hba_file_rules;" line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+-------+---------------+------------+--------------+-----------------------------------------+-------------+---------+------- 80 | local | {all} | {postgres} | | | trust | | 82 | host | {all} | {all} | 127.0.0.1 | 255.255.255.255 | ident | | 84 | host | {all} | {all} | ::1 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ident | | 87 | local | {replication} | {all} | | | peer | | 88 | host | {replication} | {all} | 127.0.0.1 | 255.255.255.255 | ident | | 89 | host | {replication} | {all} | ::1 | ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff | ident | | 92 | host | {all} | {admin} | 192.168.56.0 | 255.255.255.0 | md5 | | (7 行) -bash-4.2$ MySQLの場合はファイルが分かれていないので、select user,host from mysql.user; でアカウント関連処理 実行後に確認するか、show grants for "アカウント"@"IP or Host";で確認してあげればOK。
  9. 9. MySQL Global Role SUPER – CHANGE MASTER, KILL, PURGE MASTER LOGS, SET GLOBAL SHUTDOWN RELOAD PROCESS – SHOW ENGINE INNODB STATUSの実行にも必要 FILE ALL WITH GRANT OPTION https://dev.mysql.com/doc/refman/5.6/ja/grant.html#grant-global-privileges https://dev.mysql.com/doc/workbench/en/wb-mysql-connections-navigator-management-users-and- privileges.html#wb-users-and-privileges-admin-roles グローバル管理者権限はデータベース権限とは異なり、特定のサーバー上のすべてのデータベースに適用されます。
  10. 10. PostgreSQL Default Role CREATE ROLE name [ [ WITH ] option [ ... ] ] /*** optionは以下 ***/ SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT connlimit | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] | USER role_name [, ...] | SYSID uid ロール 可能なアクセス pg_read_all_settings    通常スーパーユーザのみが読み取れる、全ての設定変数を読み取る pg_read_all_stats    通常スーパーユーザのみが読み取れる、すべてのpg_stat_*ビューを読み取り、各種の統計関連のエクステンションを使用する pg_stat_scan_tables    潜在的に長時間、テーブルのACCESS SHAREロックを取得する可能性がある監視機能を実行する pg_signal_backend    他のバックエンドにシグナルを送信する(例:問い合わせのキャンセル、プロセスの終了) pg_read_server_files    COPYやその他のファイルアクセス関数で、データベースがサーバ上でアクセスできる任意の場所からファイルを読み取ることを許可する pg_write_server_files    COPYやその他のファイルアクセス関数で、データベースがサーバ上でアクセスできる任意の場所にファイルを書き込むことを許可する pg_execute_server_program   COPYやサーバ側のプログラムを実行できるその他の関数で、データベースを実行しているユーザとして データベースサーバ上でのプログラムの実行を許可する pg_monitor 各種の監視ビューや機能を読み取り/実行。 pg_read_all_settings、pg_read_all_statsおよびpg_stat_scan_tablesのメンバである。 参照: https://www.postgresql.jp/document/11/html/sql-createrole.html https://www.postgresql.jp/document/11/html/default-roles.html https://www.postgresql.jp/document/11/html/sql-alterrole.html
  11. 11. Case Study:Create Super User@MySQL root@localhost [mysql]> SELECT User, Host FROM mysql.user where Host = 'localhost'; +------------------+-----------+ | User | Host | +------------------+-----------+ | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+ 4 rows in set (0.00 sec) root@localhost [mysql]> create user 'admin'@'localhost' identified by 'password'; Query OK, 0 rows affected (0.01 sec) root@localhost [mysql]> grant all on *.* to 'admin'@'localhost'; Query OK, 0 rows affected (0.02 sec) root@localhost [mysql]> SELECT User, Host,Super_priv FROM mysql.user where Host = 'localhost'; +------------------+-----------+------------+ | User | Host | Super_priv | +------------------+-----------+------------+ | admin | localhost | Y | | mysql.infoschema | localhost | N | | mysql.session | localhost | Y | | mysql.sys | localhost | N | | root | localhost | Y | +------------------+-----------+------------+ 5 rows in set (0.00 sec)
  12. 12. Case Study:Create Super User@PostgreSQL postgres=# CREATE ROLE application_role SUPERUSER login password 'password'; CREATE ROLE postgres=# du ロール一覧 ロール名 | 属性 | 所属グループ ------------------+--------------------------------------------------------------------------+-------------------------------- admin | スーパユーザ | {pg_monitor,pg_signal_backend} application_role | スーパユーザ | {} postgres | スーパユーザ, ロール作成可, DB作成可, レプリケーション可, RLS のバイパス | {} postgres=# -bash-4.2$ vi /var/lib/pgsql/12/data/pg_hba.conf -bash-4.2$ cat /var/lib/pgsql/12/data/pg_hba.conf | grep app local app all md5 -bash-4.2$ /usr/pgsql-12/bin/pg_ctl reload サーバにシグナルを送信しました -bash-4.2$ psql -U application_role -d app ユーザ application_role のパスワード: psql (12.0) "help"でヘルプを表示します。 app=# z アクセス権限 スキーマ | 名前 | 型 | アクセス権限 | 列の権限 | ポリシー ----------+-------+----------+--------------+----------+---------- public | films | テーブル | | | (1 行)
  13. 13. More Info https://www.postgresql.jp/document/11/html/sql-createrole.html https://eng-entrance.com/postgresql-role https://www.dbonline.jp/postgresql/role/index6.html https://dev.mysql.com/doc/refman/8.0/en/create-user.html https://www.s-style.co.jp/blog/2018/07/2123/ https://www.dbonline.jp/mysql/user/index6.html https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0102 https://mysqlserverteam.com/mysql-8-0-making-user-management-ddls-atomic/ https://mysqlserverteam.com/the-system_user-dynamic-privilege/ Roleに関しては、MySQLとPostgreSQLでは異なる部分も多いのでそれぞれマニュアルを参照ください。 特に、MySQL8.0からは正式に複数権限まとめたRoleを作成してユーザーにアサインする事が出来るように なっているので色々な記事が書かれているので参照されると良いかと思います。

×