В Linux каждый процесс выполняется от отдельного пользователя, а каждый файл и папка принадлежат определенному пользователю.
Кроме того, доступ к этим файлам и папкам ограничен пользователями.
Это показывает, насколько важно узнать, как осуществляется управление пользователями в Linux для обычного пользователя или администратора.
Информацию о локальных пользователях можно найти в etc/passwd:
tail -9 /etc/passwd colord:x:121:126:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologin pulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin gnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/false gdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/false eugene:x:1000:1000:Eugene,,,:/home/eugene:/bin/bash systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin mysql:x:126:133:MySQL Server,,,:/nonexistent:/bin/false redis:x:127:134::/var/lib/redis:/usr/sbin/nologin
Формат интерпретируется следующим образом:
username:password:uid:gid:gecos:home/dir:shell
У групп также есть ID, и каждый пользователь принадлежит к группе по умолчанию, User Private Group (UPG).
Пользователи могут иметь дополнительные группы.
Эти дополнительные группы помогают пользователям получить доступ к другим файлам и процессам.
Информация о группах обычно находится в etc/group:
$ tail -9 /etc/group gdm:x:130: lxd:x:131:eugene eugene:x:1000: sambashare:x:132:eugene systemd-coredump:x:999: mysql:x:133: redis:x:134: vboxusers:x:135:
Формат интерпретируется следующим образом:
groupname:password:GID:<list of users>
Вы конечно слышали о пользователе root.
Пользователь root является суперпользователем, он обладает всеми полномочиями в системе.
Root может переопределить все полномочия файлов и используется для управления системой.
Как правило мы входим в систему как непривилегированный пользователь, а затем используем команду sudo для получения привилегий root.
Как администратор Linux, перед нами стоят различные задачи по управлению учетными записями пользователей, такие как добавление пользователей, их удаление и т. д.
Этими задачами легко управлять с помощью Ansible.
Мы пройдемся по ним, используя Ansible плейбук.
В Ansible модули user и group помогают нам выполнять задачи управления пользователями.
Общие параметры модуля Ansible Group
- name – название группы
- state – (absent/present) гарантирует, что группа присутствует или отсутствует
- gid – указать идентификатор группы
- system – (yes / no), является ли созданная группа системной группой или нет
Общие параметры модуля Ansible User
- name – имя пользователя
- password – зашифрованный пароль пользователя. Обратите внимание, что пароль уже должен быть зашифрован или использовать шифрование в плейбуке Ansible, но скрывать пароль в Ansible vault
- update_password – (always/on_create) обновить ли пароль или просто добавить его один раз при создании пользователя
- uid – идентификатор пользователя
- group – указать основную группу пользователей
- groups – добавить пользователя в дополнительные группы
- append – (no/yes) при добавлении пользователя в дополнительную группу не переопредея основную группу
- comment – назначить GECOS
- shell – установить оболочку по умолчанию
- remove – удалить связанные с пользователем каталоги и файлы
Создать / Добавить пользователя и группу, используя Ansible
Плейбук, user.yml:
---
- hosts: localhost #change to your hosts
become: yes
vars:
# NOTICE!!!:
# DO NOT PUT PLAIN TEXT PASSWORDS HERE!
# use encrypted passwords or put them in Ansible vault
# but this is just a demo
vaulted_password: mySecret.
tasks:
- name: Add a simple user called janedoe
user:
name: janedoe
comment: Jane Doe
- name: Add user anita with a password
user:
name: anita
password: "{{ vaulted_password | password_hash('sha512') }}"
update_password: on_create
- name: Add a group called developer
group:
name: developer
state: present
- name: Add a user johndoe and add them to a group developer
user:
name: johndoe
groups: developer
append: yes
- name: Add user jSmith and generate for them an SSH key
user:
name: jSmith
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: .ssh/id_rsa
- name: Add user noHome with no home and set account to expire on certain date
user:
name: noHome
create_home: no
expires: 1590155615
Запуская плейбук, не беспокойтесь о предупреждении, поскольку я запускаю playbook для своей master ноды в качестве узла:
$ ansible-playbook user.yml -K BECOME password: [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all' PLAY [localhost] ************************************************************************************************************************************* TASK [Gathering Facts] ******************************************************************************************************************************* ok: [localhost] TASK [Add a simple user called janedoe] ************************************************************************************************************** changed: [localhost] TASK [Add user anita with a password] **************************************************************************************************************** changed: [localhost] TASK [Add a group called developer] ****************************************************************************************************************** changed: [localhost] TASK [Add a user johndoe and add them to a group developer] ****************************************************************************************** changed: [localhost] TASK [Add user jSmith and generate for them an SSH key] ********************************************************************************************** changed: [localhost] TASK [Add user noHome with no home and set account to expire on certain date] ************************************************************************ changed: [localhost] PLAY RECAP ******************************************************************************************************************************************* localhost : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Проверьте пользователей и группы:
:~/Projects/Ansible/users$ tail -9 /etc/passwd
eugene:x:1000:1000:Eugene,,,:/home/eugene:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
mysql:x:126:133:MySQL Server,,,:/nonexistent:/bin/false
redis:x:127:134::/var/lib/redis:/usr/sbin/nologin
janedoe:x:1001:1001:Jane Doe:/home/janedoe:/bin/sh
anita:x:1002:1002::/home/anita:/bin/sh
johndoe:x:1003:1004::/home/johndoe:/bin/sh
jSmith:x:1004:1005::/home/jSmith:/bin/sh
noHome:x:1005:1006::/home/noHome:/bin/sh
eugene@jCheredi:~/Projects/Ansible/users$ tail -9 /etc/group
redis:x:134:
vboxusers:x:135:
docker:x:136:
janedoe:x:1001:
anita:x:1002:
developer:x:1003:johndoe
johndoe:x:1004:
jSmith:x:1005:
noHome:x:1006:
Удалить пользователей с помощью Ansible
Плейбук user_delete.yml:
---
- hosts: localhost
become: yes
tasks:
- name: Remove janedoe
user:
name: janedoe
state: absent
remove: yes
- name: Remove anita
user:
name: anita
state: absent
remove: yes
- name: Remove developer group
group:
name: developer
state: absent
- name: Remove johndoe
user:
name: johndoe
state: absent
remove: yes
- name: Remove jSmith
user:
name: jSmith
state: absent
remove: yes
- name: Remove noHome
user:
name: noHome
state: absent
remove: yes
Запуск плейбука:
~/Projects/Ansible/users$ ansible-playbook user_delete.yml -K
BECOME password:
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [localhost] *************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************
ok: [localhost]
TASK [Remove janedoe] **************************************************************************************************************
changed: [localhost]
TASK [Remove anita] ****************************************************************************************************************
changed: [localhost]
TASK [Remove developer group] ******************************************************************************************************************
changed: [localhost]
TASK [Remove johndoe] ******************************************************************************************
changed: [localhost]
TASK [Remove jSmith] **********************************************************************************************
changed: [localhost]
TASK [Remove noHome] ************************************************************************
changed: [localhost]
PLAY RECAP *******************************************************************************************************************************************
localhost : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0