diff --git a/roles/secrets/README.md b/roles/secrets/README.md new file mode 100644 index 0000000..8f2b246 --- /dev/null +++ b/roles/secrets/README.md @@ -0,0 +1,55 @@ +# Secrets Role + +Ansible роль для сохранения секретов на удаленной машине. + +## Описание + +Роль позволяет безопасно сохранять секреты на удаленной машине в виде файлов с ограниченными правами доступа. Поддерживает сохранение переменных как файлов и копирование существующих файлов. + +## Параметры + +### Обязательные параметры + +- `secrets_dest` - директория, куда будут сохранены секреты в виде файлов +- `secrets_user` - имя пользователя, который будет владеть директорией и файлами +- `secrets_group` - группа, которая будет владеть директорией и файлами (по умолчанию равна `secrets_user`) + +### Опциональные параметры + +- `secrets_vars` - список переменных, из которых будут извлечены секреты (по умолчанию: `[]`) +- `secrets_files` - список файлов, которые будут скопированы "как есть" (по умолчанию: `[]`) +- `secrets_dir_mode` - права доступа для директории (по умолчанию: `0750`) +- `secrets_file_mode` - права доступа для файлов с секретами (по умолчанию: `0400`) + +## Функциональность + +1. Создает директорию `secrets_dest` если она не существует +2. Сохраняет каждую переменную из `secrets_vars` как файл с таким же именем +3. Копирует файлы из `secrets_files` в директорию назначения +4. Устанавливает права доступа `0400` для всех файлов с секретами +5. Назначает указанного пользователя и группу владельцами директории и файлов + +## Пример использования + +```yaml +- name: Save application secrets + include_role: + name: secrets + vars: + secrets_dest: /opt/myapp/secrets + secrets_user: myapp + secrets_group: myapp + secrets_vars: + - database_password + - api_key + - jwt_secret + secrets_files: + - /path/to/ssl/certificate.pem + - /path/to/ssl/private.key +``` + +## Безопасность + +- Все файлы с секретами создаются с правами `0400` (только чтение для владельца) +- Директория создается с правами `0750` (полный доступ для владельца, чтение и выполнение для группы) +- Используется `no_log: true` для предотвращения вывода секретов в логи Ansible diff --git a/roles/secrets/defaults/main.yml b/roles/secrets/defaults/main.yml new file mode 100644 index 0000000..334fd23 --- /dev/null +++ b/roles/secrets/defaults/main.yml @@ -0,0 +1,9 @@ +--- +# Default variables for secrets role +secrets_dest: "" +secrets_user: "" +secrets_group: "{{ secrets_user }}" +secrets_vars: [] +secrets_files: [] +secrets_dir_mode: "0750" +secrets_file_mode: "0400" diff --git a/roles/secrets/meta/main.yml b/roles/secrets/meta/main.yml new file mode 100644 index 0000000..db38f60 --- /dev/null +++ b/roles/secrets/meta/main.yml @@ -0,0 +1,22 @@ +--- +galaxy_info: + author: 'Anton Vakhrushev' + description: Ansible role for saving secrets on remote machine + license: MIT + min_ansible_version: '2.9' + platforms: + - name: Ubuntu + versions: + - all + - name: Debian + versions: + - all + - name: EL + versions: + - all + galaxy_tags: + - secrets + - security + - files + +dependencies: [] diff --git a/roles/secrets/tasks/main.yml b/roles/secrets/tasks/main.yml new file mode 100644 index 0000000..3e803e2 --- /dev/null +++ b/roles/secrets/tasks/main.yml @@ -0,0 +1,46 @@ +--- +# tasks file for secrets role + +- name: "Validate secrets_dest parameter" + ansible.builtin.fail: + msg: "secrets_dest is required but not defined" + when: secrets_dest is not defined or secrets_dest == "" + +- name: "Validate secrets_user parameter" + ansible.builtin.fail: + msg: "secrets_user is required but not defined" + when: secrets_user is not defined or secrets_user == "" + +- name: "Validate secrets_group parameter" + ansible.builtin.fail: + msg: "secrets_group is required but not defined" + when: secrets_group is not defined or secrets_group == "" + +- name: "Create secrets destination directory" + ansible.builtin.file: + path: "{{ secrets_dest }}" + state: directory + owner: "{{ secrets_user }}" + group: "{{ secrets_group }}" + mode: "{{ secrets_dir_mode }}" + +- name: "Save variables as secret files" + ansible.builtin.copy: + content: "{{ lookup('vars', item) }}" + dest: "{{ secrets_dest }}/{{ item }}" + owner: "{{ secrets_user }}" + group: "{{ secrets_group }}" + mode: "{{ secrets_file_mode }}" + loop: "{{ secrets_vars }}" + when: secrets_vars | length > 0 + no_log: true + +- name: "Copy secret files" + ansible.builtin.copy: + src: "{{ item }}" + dest: "{{ secrets_dest }}/{{ item | basename }}" + owner: "{{ secrets_user }}" + group: "{{ secrets_group }}" + mode: "{{ secrets_file_mode }}" + loop: "{{ secrets_files }}" + when: secrets_files | length > 0