cogini.users

ユーザー

このAnsibleロールはユーザーアカウントを管理し、SSHキーを使用してアクセスを制御します。

サーバーにアプリケーションを1つまたは複数デプロイするために使用されます。アプリをデプロイおよび実行するためのアカウントや、システム管理者や開発者用のアカウントを作成することができます。

基本的には、Ansibleのユーザーモジュール に基づいたロールです。

ユーザータイプ

このロールは、以下のタイプのユーザーアカウントの作成をサポートします:

  • グローバルシステム管理者 / オペレーションチーム

これらのユーザーは、sudo権限を持つ独自のログインを持ちます。wheel または admin グループに追加し、パスワードなしでsudoを実行できるようにします。

サーバーをプロビジョニングする際、プロジェクトに依存せずにシステム管理チーム用のアカウントを自動的に作成します。

  • プロジェクト管理者 / パワーユーザー

これらのユーザーはグローバル管理者と同じ権利を持ちますが、プロジェクトまたはサーバーごとに設定され、インベントリのホスト/グループ変数で制御されます。通常、プロジェクトのテックリードが管理者になります。

  • デプロイアカウント

このユーザーアカウントは、アプリケーションをサーバーにデプロイするために使用されます。アプリケーションソフトウェアファイルの所有者であり、デプロイおよび設定ディレクトリへの書き込み権限があります。

アプリとデプロイアカウントにはsudo権限はありませんが、/etc/sudoers.d/ ルールを作成して、例えば systemctl を使用してアプリを再起動できるようにすることができます。これは、このロールではなく、アプリをインストールおよび構成するロールによって管理されます。

例えば、以下のようなファイルを作成します: /etc/sudoers.d/deploy-foo:

deploy ALL=(ALL) NOPASSWD: /bin/systemctl start foo, /bin/systemctl stop foo, /bin/systemctl restart foo, /bin/systemctl status foo
  • アプリアカウント

アプリケーションはこのユーザーアカウントの下で実行されます。

このアカウントは、実行時に必要なディレクトリへ書き込みアクセスを持ち、コードや設定ファイルには読み取り専用のアクセスを持ちます。

  • 開発者

開発者は、ログを確認したりデバッグしたりするためにデプロイやアプリのユーザーアカウントにアクセスする必要があるかもしれません。開発者用のSSHキーをアカウントに追加し、SSHを介してログインできるようにします。

  • プロジェクトユーザー

これらのユーザーは管理者のようですが、sudo権限は持っていません。例えば、顧客がログインしてDBに対してクエリを実行できるアカウントなどです。彼らは管理者権限を必要としません。logファイルなどへのアクセス権限を与えることができます。

設定

デフォルトでは、このロールは何もしません。動作させるためには、設定変数を追加する必要があります。通常、グループ変数を通じて行われます、例えば inventory/group_vars/app_servers やプレイブックの vars セクション、もしくはその組み合わせです。

ホストレベルやグループレベルで異なる設定を持つことができ、例えば開発環境では開発者にログインアクセスを与え、本番環境では与えないことができます。

アプリアカウント

アプリをデプロイするアカウントです。 オプションで、指定されていなければデプロイユーザーは作成されません。

users_deploy_user: deploy
users_deploy_group: deploy

アプリを実行するアカウントです。 オプションで、指定されていなければアプリユーザーは作成されません。

users_app_user: foo
users_app_group: foo

ユーザーアカウント

users_users は、ユーザー用のUnixアカウント名とSSHキーを定義します。

これは、4つのフィールドを持つ辞書のリストです:

  • user: Unixアカウントの名前
  • name: ユーザーの名前。オプション、ドキュメント用。
  • key: SSH公開鍵ファイル。プレイブックの files ディレクトリに置きます。
  • github: ユーザーのGitHub ID。ロールは https://github.com/{{ github }}.keys からユーザーのキーを取得します。

例:

users_users:
  - user: jake
    name: "Jake Morrison"
    github: reachfh
  - user: ci
    name: "CIサーバー"
    key: ci.pub

ユーザーリスト

users_users でユーザーアカウントを定義した後、userキーで使われるIDを指定してユーザーリストを構成します。デフォルトではこれらは空なので、ユーザーを指定しないと作成されません。

グローバル管理者は別のUnixアカウントとsudo権限を持ちます。

users_global_admin_users:
 - jake

プロジェクトレベルの管理者は別のUnixアカウントとsudo権限を持ちます。

users_admin_users:
 - fred

プロジェクトユーザーは別のUnixアカウントを持ちますが、sudo権限はありません。

users_regular_users:
 - bob

デプロイアカウントにアクセスできるユーザー(SSHキー)。

users_deploy_users:
 - ci

アプリアカウントにアクセスできるユーザー(SSHキー)。

users_app_users:
 - fred

グループ設定

異なるタイプのユーザーが持つ追加のグループを指定できます。デフォルトではこれらのリストは空ですが、アプリへのアクセスを微調整するのに使用できます。

通常、SSHを設定して、ユーザーアカウントは sshusers グループのメンバーでなければSSHでログインできないようにします。

/etc/ssh/sshd_config に以下を追加します:

AllowGroups sshusers sftpusers

その後、users_admin_groupssshusers を追加します。例えば:

users_admin_groups:
  - sshusers

管理者ユーザーが持つべきUnixグループ

ロールは常に wheel または admin グループに追加されます。管理者ユーザーが定義されている場合、ロールは /etc/sudoers.d/00-admin ファイルでsudoを設定し、管理者ユーザーがパスワードなしでsudoを実行できるようにします。

users_admin_groups:
  - sshusers

通常ユーザーが持つべきUnixグループ:

users_regular_groups:
  - sshusers

デプロイユーザーが持つべきUnixグループ:

users_deploy_groups:
  - sshusers

アプリユーザーが持つべきUnixグループ:

users_app_groups:
  - sshusers

ユーザーの削除

このロールは、作成するユーザーに対して "ansible-" というコメントを定義します。これにより、ユーザーがリストに追加または削除された際に追跡し、アカウントを削除することができます。

users_delete_users リストにアカウントを指定すると、それらも削除されます。これは、レガシーアカウントをクリーンアップするのに役立ちます。

アカウントを削除するときにユーザーのホームディレクトリを削除するかどうかを users_delete_remove および users_delete_force 変数で制御できます。詳細についてはAnsibleのドキュメントを参照してください。安全のため、これらの変数はデフォルトで no ですが、このロールでシステムユーザーを管理している場合、yes に設定することをお勧めします。

users_delete_remove: yes
users_delete_force: yes

ロールはオプションで 'root' や 'ubuntu' などのシステムユーザーから承認済みのキーを削除できます。これは、名付けられた管理者ユーザーを設定した後、バックアップ用のrootキーを避けるために有益です。

users_remove_system_authorized_keys: true

セットアップ

通常の手順として、新しいインスタンスで最初にこのロールを実行します。これにより、管理者ユーザーが作成され、他のロールを実行するためのキーが設定されます。プロジェクト特有のロールがアプリのためのサーバーの準備を担当し、ディレクトリを作成し、依存関係をインストールします。通常、デプロイユーザーアカウントを使用し、sudoなしでビルドまたはCIサーバーからアプリをデプロイします。

以下は典型的なプレイブックです:

- name: ユーザーを管理する
  hosts: '*'
  vars:
    users_app_user: foo
    users_app_group: foo
    users_deploy_user: deploy
    users_deploy_group: deploy
    users_users:
      - user: jake
        name: "Jake Morrison"
        github: reachfh
    users_app_users:
      - jake
    users_deploy_users:
      - jake
  roles:
    - { role: cogini.users, become: true }

ホストを inventory/hosts ファイルに追加します。

[web-servers]
web-server-01

ホストを .ssh/config またはプロジェクト特有の ssh.config ファイルに追加します。

Host web-server-01
    HostName 123.45.67.89

SSHキーなしでrootアカウントから始める物理サーバーでは、初めてサーバーをブートストラップする必要があります。パスワードを -k で指定します。

ansible-playbook -k -u root -v -l web-server-01 playbooks/manage-users.yml --extra-vars "ansible_host=123.45.67.89"

macOSでは -k コマンドにはaskpassユーティリティが必要であり、デフォルトではインストールされていないため、Paramikoにフォールバックします。Paramikoは .ssh/config を理解しないため、ansible_host を手動で指定します。

その後の実行では、管理者ユーザーが設定された後、以下のようにします:

ansible-playbook -u $USER -v -l web-server-01 playbooks/manage-users.yml

レガシーユーザーの削除

削除するレガシーユーザーアカウントを users_delete_users リストで定義します。例えば:

ansible-playbook -u $USER -v -l web-servers playbooks/manage-users.yml --extra-vars "users_delete_users=[fred] users_delete_remove=yes users_delete_force=yes"

ライセンス

MIT

著者情報

Jake Morrison Cogini

プロジェクトについて

Manage user accounts and control access to them with ssh keys

インストール
ansible-galaxy install cogini.users
ライセンス
mit
ダウンロード
355
所有者
Product development services for ambitious innovators