<Chapter id="user-manag">
<!--  <title>Database User and Permission Management</title> -->
 <title>データベースユーザーと権限の管理</title>
<indexterm><primary sortas="ゆーざー">ユーザー</primary></indexterm>
<indexterm><primary sortas="でーたべーすゆーざー">データベースユーザー</primary></indexterm>
<indexterm><primary sortas="けんげん">権限</primary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="ゆーざー">ユーザー</secondary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="でーたべーすゆーざー">データベースユーザー</secondary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary></indexterm>
 <para>
  <!-- Managing database users and their privileges is in concept 
  similar to that of Unix operating systems, but then again not 
  identical enough to not warrant explanation. -->
  
  データベースユーザーと権限の管理は、概念的にはUnixオペレーティングシステムのもの似ていますが、説明をしなくてもよいほど同じというわけではありません。
 </para>

 <sect1 id="database-users">
  <!-- <title>Database Users</title>-->
  <title>データベースユーザー</title>
  <para>
   <!-- Database users are conceptually completely separate from any
   operating system users. In practice it might be convenient to
   maintain a correspondence, but this is not required. Database user
   names are global across a database cluster installation (and not
   per individual database). To create a user use the <command>CREATE
   USER</command> SQL command: -->

   データベースユーザーは概念的に、どのオペレーティングシステムユーザーとも完全に異なります。実際にはユーザー名と一致させておくと便利ですが、必須ではありません。データベースユーザー名はデータベースクラスタインストールを通して共通です（個別のデータベースごとにではありません）。ユーザーを作成するためにはSQLコマンドの<command>CREATE USER</command>を使います。<indexterm><primary>CREATE USER</primary></indexterm><indexterm><primary>SQL</primary><secondary>CREATE USER</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="さくせい">作成</secondary></indexterm>
</para>

<synopsis>
CREATE USER <replaceable>name</replaceable>
</synopsis>

<para>
   <!-- 
   <replaceable>name</replaceable> follows the rules for SQL
   identifiers: either unadorned without special characters, or
   double-quoted. To remove an existing user, use the analog
   <command>DROP USER</command> command. -->

   <replaceable>name</replaceable>はSQL識別子のルールに従います。特殊な文字を持たない無装飾のものか、二重引用符に囲まれたもののどちらかです。既存のユーザーを削除するためには類似のコマンド<command>DROP USER</command>を使います。<indexterm><primary>DROP USER</primary></indexterm><indexterm><primary>SQL</primary><secondary>DROP USER</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="さくじょ">削除</secondary></indexterm>
  </para>

  <para>
   <!-- 
   For convenience, the shell scripts <filename>createuser</filename>
   and <filename>dropuser</filename> are wrappers around these SQL
   commands. -->

  便利なものとして、シェルスクリプト<filename>createuser</filename>と<filename>dropuser</filename>があります。これらのSQLコマンドのラッパーです。<indexterm><primary>createuser</primary></indexterm><indexterm><primary>dropuser</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary>createuser</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary>dropuser</secondary></indexterm>
  </para>

  <para>
   <!-- 
   In order to bootstrap the database system, a freshly initialized
   system always contains one predefined user. This user will have
   the same name as the operating system user that initialized the
   area (and is presumably being used as the user that runs the
   server). Thus, often an initial user <quote>postgres</quote>
   exists. In order to create more users you have to first connect as
   this initial user. -->

   データベースシステム自身を起動するために、初期化されたばかりのシステムはいつも定義済みのユーザーを1人持ちます。このユーザーはその領域を初期化したオペレーティングシステムユーザーと（そしておそらくサーバーを起動したユーザーとして使われている）サーバー同じ名前です。したがって、もともと<quote>postgres</quote>ユーザーが存在することがしばしばあります。さらにユーザーを作る場合はまずこのユーザーで接続しなければいけません。<indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary>postgres</secondary></indexterm>

  </para>

  <para>
   <!-- 
   The user name to use for a particular database connection is
   indicated by the client that is initiating the connection request
   in an application-specific fashion. For example, the
   <command>psql</command> program uses the <option>-U</option>
   command line option to indicate the user to connect as. The set of
   database users a given client connection may connect as is
   determined by the client authentication setup, as explained in
   <xref linkend="client-authentication">. (Thus, a client is not
   necessarily limited to connect as the user with the same name as
   its operating system user in the same way a person is not
   constrained in its login name by her real name.) -->

   特定のデータベース接続に使うユーザー名は、アプリケーション指定の流儀で接続要求を出すクライアントによって示されます。たとえば、<command>psql</command>プログラムはコマンドラインオプション<option>-U</option>を使って接続するユーザーを示します。与えられたクライアント接続が接続できるデータベースユーザーの集合は、<xref linkend="client-authentication">で説明されているように、クライアント認証の設定によって決められます（したがって、ユーザーのログイン名が本名と一致していなくてもかまわないのと同様に、クライアントは必ずしもオペレーティングシステムユーザー名と同じ名前で接続する必要はありません）。
  </para>

  <sect2 id="user-attributes">
   <!-- <title>User attributes</title> -->
   <title>ユーザー属性</title>
<indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="ぞくせい">属性</secondary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="ゆーざーぞくせい">ユーザー属性</secondary></indexterm>
   <para>
    <!-- A database user may have a number of attributes that define its
    privileges and interact with the client authentication system. -->

    データベースユーザーには、権限やクライアント認証システムに関する定義を表すたくさんの属性があります。
</para>

    <variablelist>
     <varlistentry>
      <!-- <term>superuser</term> -->
      <term>スーパーユーザー</term><indexterm><primary sortas="すーぱーゆーざー">スーパーユーザー</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="すーぱーゆーざー">スーパーユーザー</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="ぞくせい">属性</secondary><tertiary sortas="すーぱーゆーざー">スーパーユーザー</tertiary></indexterm>
      <listitem>
       <para>
        <!-- A database superuser bypasses all permission checks. Also,
        only a superuser can create new users. To create a database
        superuser, use <literal>CREATE USER name
        CREATEUSER</literal>. -->

        データベースのスーパーユーザーはすべての権限認証をパスします。そして、スーパーユーザーのみが新しいユーザーを作ることができます。データベースのスーパーユーザーを作るには、<literal>CREATE USER name CREATEUSER</literal>を使います。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <!-- <term>database creation</term> -->
      <term>データベース作成</term><indexterm><primary sortas="でーたべーすさくせい">データベース作成</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="でーたべーすさくせい">データベース作成</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="ぞくせい">属性</secondary><tertiary sortas="でーたべーすさくせい">データベース作成</tertiary></indexterm>
      <listitem>
       <para>
        <!-- 
        A user must be explicitly given permission to create databases
        (except for superusers, since those bypass all permission
        checks). To create such a user, use <literal>CREATE USER name
        CREATEDB</literal>. -->

        データベースを作成するためにはユーザーは明示的に権限を指定しておかねばいけません（スーパーユーザーはすべての権限認証をパスするので除かれます）。そのようなユーザーを作るためには<literal>CREATE USER name CREATEDB</literal>を使います。
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <!-- <term>password</term> -->
      <term>パスワード</term><indexterm><primary sortas="ぱすわーど">パスワード</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="ぱすわーど">パスワード</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="ぞくせい">属性</secondary><tertiary sortas="ぱすわーど">パスワード</tertiary></indexterm>
      <listitem>
       <para>
        <!-- 
        A password is only significant if password authentication is
        used for client authentication. Database passwords a separate
        from any operating system passwords. Specify a password upon
        user creating as in <literal>CREATE USER name WITH PASSWORD
        'string'</literal>. -->

        パスワードは、パスワード認証がクライアント認証に使われる場合にのみ重要になります。データベースパスワードはどのオペレーティングシステムパスワードとも異なります。ユーザー作成時に<literal>CREATE USER name WITH PASSWORD 'string'</literal>のようにパスワードを指定します。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>


<para>
    <!-- See the reference pages for <command>CREATE USER</command> and
    <command>ALTER USER</command> for details. -->
詳細は<command>CREATE USER</command>と<command>ALTER USER</command>のリファレンスページを参照してください。
   </para>
  </sect2>
 </sect1>

 <sect1 id="groups">
  <!-- <title>Groups</title> -->
  <title>グループ</title>
<indexterm><primary sortas="ぐるーぷ">グループ</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="ぐるーぷ">グループ</secondary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary sortas="ぐるーぷ">グループ</secondary></indexterm>
  <para>
   <!-- As in Unix, groups are a way of logically grouping users. To create
   a group, use -->
   Unixと同じように、グループはユーザーを論理的に分類するための方法です。グループを作成するには下記のようにします。
</para>

<synopsis>
CREATE GROUP <replaceable>name</replaceable>
</synopsis>

<para>
   <!-- To add users to or remove users from a group, respectively, use -->
グループにユーザーを追加、または削除する場合は、下記のどちらかを使います。
</para>

<synopsis>
ALTER GROUP <replaceable>name</replaceable> ADD USER <replaceable>uname1</replaceable>, ...
ALTER GROUP <replaceable>name</replaceable> DROP USER <replaceable>uname1</replaceable>, ...
</synopsis>
 </sect1>

 <sect1 id="privileges">
  <!-- <title>Privileges</title> -->
  <title>権限</title>
<indexterm><primary sortas="けんげん">権限</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary></indexterm>
  <para>
   <!-- When a database object is created, it is assigned an owner. The
   owner is the user that executed the creation statement. There is
   currenty no polished interface for changing the owner of a database
   object. By default, only an owner (or a superuser) can do anything
   with the object. In order to allow other users to use it,
   <firstterm>privileges</firstterm> must be granted. -->

   データベースオブジェクトが作成されるとその所有者が設定されます。所有者はその作成文を実行したユーザーです。現在のところデータベースオブジェクトの所有者を変更するための洗練されたインターフェイスはまだありません。デフォルトでは、所有者（もしくはスーパーユーザー）のみがそのオブジェクトに対して変更を加えることができます<footnote><para>訳注：バージョン7.1からはalter table文でテーブルの所有者権限が変更できるようになっています</para></footnote>。その他のユーザーがオブジェクトを使うためには、<firstterm>権限</firstterm>が与えられていなければいけません。

  </para>

  <para>
   <!-- Currently, there are four different privileges: select (read),
   insert (append), and update/delete (write), as well as
   <literal>RULE</literal>, the permission to create a rewrite rule on
   a table. The right to modify or destroy an object is always the
   privilege of the owner only. To assign privileges, the
   <command>GRANT</command> command is used. So, if
   <literal>joe</literal> is an existing user, and
   <literal>accounts</literal> is an existing table, write access can
   be granted with -->

   現段階では、4つの異なる権限があります。select（読み込み）、insert（追加）、update/delete（書き込み）、テーブルに対しての決まりを書き換えるための権限である<literal>RULE</literal>です。オブジェクトを変更もしくは削除する権利は常に所有者にしかありません。権限を与えるためには、<command>GRANT</command>コマンドが使われます。もし<literal>joe</literal>というユーザーがいて<literal>accounts</literal>というテーブルがあった場合、書き込みアクセスは下記のように与えるすることができます。<indexterm><primary>GRANG</primary></indexterm><indexterm><primary>SQL</primary><secondary>GRANT</secondary></indexterm><indexterm><primary sortas="けんげん">権限</primary><secondary sortas="SELECT">SELECT</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary><tertiary sortas="SELECT">SELECT</tertiary></indexterm><indexterm><primary sortas="けんげん">権限</primary><secondary sortas="INSERT">INSERT</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary><tertiary sortas="INSERT">INSERT</tertiary></indexterm><indexterm><primary sortas="けんげん">権限</primary><secondary sortas="UPDATE">UPDATE</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary><tertiary sortas="UPDATE">UPDATE</tertiary></indexterm><indexterm><primary sortas="けんげん">権限</primary><secondary sortas="DELETE">DELETE</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary><tertiary sortas="DELETE">DELETE</tertiary></indexterm><indexterm><primary sortas="けんげん">権限</primary><secondary sortas="RULE">RULE</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="けんげん">権限</secondary><tertiary sortas="RULE">RULE</tertiary></indexterm></para>

<programlisting>
GRANT UPDATE ON accounts TO joe;
</programlisting>
   <!-- The user executing this command must be the owner of the table. To
   grant a privilege to a group, use -->

<para>このコマンドを実行するユーザーはそのテーブルの所有者でなければいけません。グループに権限を与える場合は以下のようにします。</para>

<programlisting>
GRANT SELECT ON accounts TO GROUP staff;
</programlisting>
   <!-- 
   The special <quote>user</quote> name <literal>PUBLIC</literal> can
   be used to grant a privilege to every user on the system. Using
   <literal>ALL</literal> in place of a privilege specifies that all
   privileges will be granted. -->

<para>特別な<quote>ユーザー</quote>名<literal>PUBLIC</literal>は、システム上のすべてのユーザーに権限を与えるために使われます。指定する権限に<literal>ALL</literal>を使うと、すべての権限が与えられます。<indexterm><primary>PUBLIC</primary></indexterm><indexterm><primary sortas="ゆーざー">ユーザー</primary><secondary>PUBLIC</secondary></indexterm>

  </para>

  <para>
   <!-- To revoke a privilege, use the fittingly named
   <command>REVOKE</command> command: -->

    権限を無効にするためには<command>REVOKE</command>コマンドを使います。<indexterm><primary>REVOKE</primary></indexterm><indexterm><primary>SQL</primary><secondary>REVOKE</secondary></indexterm></para>


<programlisting>
REVOKE ALL ON accounts FROM PUBLIC;
</programlisting>
   <!-- The set of privileges held by the table owner is always implicit
   and is never revokable. -->

<para>テーブル所有者が保持する権限の集合は、常に明示的であり無効にすることはできません。

  </para>
 </sect1>

 <sect1 id="perm-functions">
  <!-- <title>Functions and Triggers</title> -->
  <title>関数とトリガ</title>
<indexterm><primary sortas="かんすう">関数</primary></indexterm><indexterm><primary sortas="とりが">トリガ</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="かんすう">関数</secondary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="とりが">トリガ</secondary></indexterm>
  <para>
   <!-- 
   Functions and triggers allow users to insert code into the backend
   server that other users may execute without knowing it. Hence, both
   mechanisms permit users to <firstterm>trojan horse</firstterm>
   others with relative impunity. The only real protection is tight
   control over who can define functions (e.g., write to relations
   with SQL fields) and triggers. Audit trails and alerters on the
   system catalogs <literal>pg_class</literal>,
   <literal>pg_user</literal> and <literal>pg_group</literal> are also
   possible. -->

   関数とトリガはユーザーが、他のユーザーが意識しないで実行できるようなコードを、バックエンドサーバーに挿入することを可能にします。したがって、どちらの機能もユーザーが罰せられることなく<firstterm>トロイの木馬</firstterm>を実行することができるのです。唯一の保護は誰が関数やトリガを定義できるか（たとえば、SQLフィールドでのリレーションへの書き込みなど）という管理です。システムカタログ<literal>pg_class</literal>、<literal>pg_user</literal>、<literal>pg_group</literal>の記録やalerterを監査することで可能です。
  </para>

  <para>
   <!-- 
   Functions written in any language except SQL run inside the backend
   server process with the operating systems permissions of the
   database server daemon process. It is possible to change the
   server's internal data structures from inside of trusted functions.
   Hence, among many other things, such functions can circumvent any
   system access controls. This is an inherent problem with
   user-defined C functions. -->

   SQL以外の言語で書かれた関数は、すべてデータベースサーバーデーモンプロセスのオペレーティングシステム権限で、バックエンドサーバーの中で実行されます。サーバーの内部データ構造を渡された関数の内部から変更することは可能です。したがって、その他の多数のことの中でも、そのような関数はどのようなシステムアクセスコントロールも回避することができます。これはユーザー定義C関数の固有の問題です。

  </para>

 </sect1>

</Chapter>
