Руководство по настройке плагина шифрования Amazon Web Services (AWS) Key Management Service (KMS)
Обзор
MariaDB содержит надежное шифрование данных в памяти, в состоянии покоя. Эта функция использует гибкий интерфейс плагинов, позволяющий выполнять фактическое шифрование с использованием подхода управления ключами, соответствующего потребностям клиента. MariaDB Server, начиная с MariaDB 10.2, включает плагин, использующий Amazon Web Services (AWS) Key Management Service (KMS) для облегчения разделения обязанностей и удаленного протоколирования и аудита запросов доступа к ключам.
Вместо хранения ключа шифрования в локальном файле, этот плагин хранит мастер-ключ в AWS KMS. При первом запуске MariaDB плагин AWS KMS подключится к AWS Key Management Service и запросит сгенерировать новый ключ. MariaDB сохранит этот ключ на диске в зашифрованном виде. Сохранённый на диске ключ нельзя использовать для расшифровки данных; вместо этого при каждом запуске MariaDB подключается к AWS KMS и запрашивает расшифровку сохранённого локального ключа. Расшифрованный ключ хранится в памяти до тех пор, пока процесс сервера MariaDB работает, и этот расшифрованный ключ в памяти используется для шифрования локальных данных.
Это руководство основано на CentOS 7, используя systemd с включенным SELinux. Некоторые шаги будут отличаться, если вы используете другие операционные системы или конфигурации.
Установка пакета плагина
Плагин AWS Key Management зависит от AWS SDK для C++, который использует лицензию Apache, версия 2.0. Эта лицензия несовместима с лицензией GPL 2.0 MariaDB Server, поэтому мы не можем распространять пакеты, содержащие плагин AWS Key Management. Следовательно, единственный способ в настоящее время получить плагин — установить его из исходного кода.
Установка из исходного кода
При компиляции MariaDB из исходного кода плагин AWS Key Management по умолчанию не создается в MariaDB 10.1, но он создается по умолчанию в MariaDB 10.2 и более поздних версиях на системах, поддерживающих его.
Компиляция контролируется аргументами -DPLUGIN_AWS_KEY_MANAGEMENT=DYNAMIC -DAWS_SDK_EXTERNAL_PROJECT=1 cmake.
Плагин использует AWS C++ SDK, что приводит к следующим ограничениям:
- Плагин может быть скомпилирован только на Windows, Linux и macOS.
- Плагин требует использования одного из следующих компиляторов:
gcc4.8 или более поздней версии,clang3.3 или более поздней версии, Visual Studio 2013 или более поздней версии. - В Unix необходимо установить пакет разработки
libcurl(например,libcurl3-devв Debian Jessie), пакет разработкиuuidиopenssl. - Возможно, вам потребуется использовать более новую версию cmake, чем по умолчанию предоставляется вашей ОС.
Установка плагина
Даже после установки пакета, содержащего общую библиотеку плагина в операционной системе, плагин не устанавливается в MariaDB по умолчанию. Существует два метода установки плагина с MariaDB.
Первый метод можно использовать для установки плагина без перезапуска сервера. Вы можете установить плагин динамически, выполнив INSTALL SONAME или INSTALL PLUGIN. Например:
INSTALL SONAME 'aws_key_management';
Второй метод позволяет указать серверу загружать плагин при запуске. Плагин можно установить таким образом, указав параметры --plugin-load или --plugin-load-add. Это можно указать в качестве аргумента командной строки для mysqld, или в соответствующей группе параметров сервера в группе опций в файле опций. Например:
[mariadb] ... plugin_load_add = aws_key_management
Регистрация в Amazon Web Services
Если у вас уже есть учетная запись AWS, вы можете пропустить этот раздел.
- Загрузите http://aws.amazon.com/.
- Нажмите «Создать бесплатную учетную запись» и выполните шаги.
- Вам потребуется ввести данные вашей кредитной карты. Расходы, связанные только с использованием сервиса AWS KMS, должны быть ограничены примерно 1 доллар в месяц для единственного мастер-ключа, который мы создадим. Если вы используете другие сервисы, могут применяться дополнительные расходы. Обратитесь к принципам ценообразования в облаке AWS https://aws.amazon.com/pricing/ для получения дополнительной информации о ценообразовании AWS-сервисов.
- Вам необходимо будет завершить процесс проверки идентификации AWS.
Создание пользователя или роли IAM
После создания учетной записи или входа в существующую учетную запись выполните следующие действия, чтобы создать пользователя или роль IAM с ограниченными привилегиями, которые будут использовать (но не администрировать) ваш мастер-ключ шифрования.
Если вы планируете запустить MariaDB Server на экземпляре EC2, вам следует создать роль (или изменить существующую роль, уже присоединенную к вашему экземпляру). Если вы планируете запустить MariaDB Server вне AWS, вы можете создать пользователя.
Создание роли IAM
- Загрузите консоль управления идентификацией и доступом по адресу https://console.aws.amazon.com/iam/.
- Нажмите «Роли» в левой боковой панели
- Нажмите «Создать новую роль»
- Выберите «Роль сервиса AWS»
- Нажмите кнопку «Выбрать» рядом с «Amazon EC2 / Разрешает экземплярам EC2 вызывать AWS-сервисы от вашего имени»
- Не выбирайте никаких политик на странице «Прикрепить политику». Нажмите «Далее»
- Нажмите «Далее»
- Присвойте вашей роли «Имя роли»
- Нажмите «Создать роль»
Создание пользователя IAM
- Загрузите консоль управления идентификацией и доступом по адресу https://console.aws.amazon.com/iam/.
- Нажмите «Пользователи» в левой боковой панели.
- Нажмите кнопку «Создать новых пользователей»
- Введите имя пользователя, например «MDBEnc». Оставьте галочку «Сгенерировать ключ доступа для каждого пользователя».
- Нажмите «Создать».
- Нажмите «Показать учетные данные безопасности пользователя».
- Скопируйте ID ключа доступа и секретный ключ доступа. При необходимости вы можете нажать «Скачать учетные данные». Эти данные нам понадобятся для взаимодействия локальных программ с AWS с помощью его API.
- Создайте на компьютере файл для хранения учетных данных этого пользователя. Мы будем использовать этот файл позже. Его структура должна быть такой:
[default] aws_access_key_id = AKIAIG6IZ6TKF52FVV5A aws_secret_access_key = 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
- Нажмите «Закрыть». Если появится запрос, потому что вы не скачали учетные данные, убедитесь, что вы их сохранили где-нибудь, и нажмите «Закрыть».
Создание мастер-ключа шифрования
Теперь мы создадим мастер-ключ шифрования. Этот ключ никогда не может быть получен ни одним приложением или пользователем. Этот ключ используется удалённо для шифрования (и расшифровки) фактических ключей шифрования, которые будут использоваться MariaDB. Если этот ключ будет удален или вы потеряете к нему доступ, вы не сможете использовать содержимое каталога данных MariaDB.
- Нажмите «Ключи шифрования» в левой боковой панели.
- Нажмите кнопку «Начать сейчас»
- Используйте раскрывающийся список «Фильтр», чтобы выбрать регион, в котором вы хотите создать свой мастер-ключ.
- Нажмите кнопку «Создать ключ».
- Введите псевдоним и описание по своему усмотрению.
- Нажмите «Далее»
- Не ставьте галочку, чтобы сделать вашу роль IAM или пользователя IAM администратором ключа.
- Нажмите «Далее» ещё раз.
- Поставьте галочки, чтобы предоставить вашей роли IAM и/или пользователю IAM разрешения на использование этого ключа.
- Нажмите «Далее»
- Нажмите «Готово»
Теперь вы должны увидеть свой ключ в консоли:
Вы будете использовать «Псевдоним», который вы предоставили, при последующей настройке MariaDB.
Теперь у нас есть мастер-ключ клиента и пользователь IAM, имеющий привилегии доступа к нему с помощью учетных данных доступа. Этого достаточно для начала использования плагина AWS KMS.
Настройка учетных данных AWS
Существует несколько способов предоставить учетные данные IAM плагину AWS KMS. Плагин поддерживает чтение учетных данных из всех стандартных расположений, используемых различными клиентами API AWS.
Самый простой подход — запустить MariaDB Server на экземпляре EC2, на котором есть роль IAM с доступом пользователя к CMK, который вы хотите использовать. Вы можете предоставить разрешения на доступ к ключу роли, уже присоединенной к вашему экземпляру EC2, или вы можете создать новую роль IAM и прикрепить её к уже запущенному экземпляру EC2. Если вы это сделали, дальнейшая настройка учетных данных не требуется, и вам не нужно создавать файл credentials.
Если вы не запускаете MariaDB Server на экземпляре EC2, вы также можете разместить учетные данные в каталоге данных MariaDB. Клиент API AWS ищет файл credentials в подкаталоге .aws домашнего каталога пользователя, запускающего процесс клиента. В случае MariaDB, его домашний каталог — это datadir.
- Создайте файл
credentials, который может читать MariaDB. Используйте регион, который вы выбрали при создании ключа. Мастер-ключи не могут использоваться в разных регионах. Например:$ cat /var/lib/mysql/.aws/credentials [default] aws_access_key_id = AKIAIG6IZ6TKF52FVV5A aws_secret_access_key = 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 region = us-east-1
- Измените разрешения файла, чтобы он принадлежал пользователю
mysqlи мог читаться только им:chown mysql /var/lib/mysql/.aws/credentials chmod 600 /var/lib/mysql/.aws/credentials
Настройка MariaDB
- Создайте новый файл опций, чтобы сообщить MariaDB о включении функции шифрования и использовании плагина AWS KMS. Создайте новый файл в
/etc/my.cnf.d/(или в том месте, где ваша ОС позволяет создавать такие файлы) с содержимым, подобным этому:
[mariadb] plugin_load_add = aws_key_management aws-key-management = FORCE_PLUS_PERMANENT aws-key-management-master-key-id = alias/mariadb-encryption aws-key-management-region = us-east-1 !include /etc/my.cnf.d/enable_encryption.preset
- Добавьте значение "Alias", скопированное выше, в
alias/для использования в качестве значения для параметраaws-key-management-master-key-id.
Обратите внимание, что вы обязательно должны включить aws-key-management-region в свой файл .cnf, если вы не используете регион us-east-1.
Теперь вы указали MariaDB использовать плагин AWS KMS и добавили учетные данные для плагина в место, где он сможет их найти. Файл /etc/my.cnf.d/enable_encryption.preset содержит набор параметров, которые включают все доступные функции шифрования.
При запуске MariaDB плагин AWS KMS подключится к AWS Key Management Service и попросит его сгенерировать новый ключ. MariaDB сохранит этот ключ на диске в зашифрованном виде. Сохранённый на диске ключ не может быть использован для расшифровки данных; вместо этого при каждом запуске MariaDB необходимо подключаться к AWS KMS и запрашивать у сервиса расшифровку локально сохранённого ключа. Расшифрованная версия хранится в оперативной памяти, пока работает процесс сервера MariaDB, и этот расшифрованный ключ в оперативной памяти используется для шифрования локальных данных.
SELinux и исходящие подключения от MariaDB
Поскольку MariaDB необходимо подключаться к сервису AWS KMS, вы должны убедиться, что у хоста есть исходящее сетевое подключение по порту 443 к AWS, и вы должны убедиться, что локальные политики позволяют процессу сервера MariaDB осуществлять эти исходящие подключения. По умолчанию SELinux ограничивает MariaDB от таких подключений.
Самый простой способ разрешить SELinux исходящие HTTPS-подключения от MariaDB — это включить булеву переменную mysql_connect_any, как показано ниже:
setsebool -P mysql_connect_any 1
Существуют более сложные альтернативы с более точным эффектом, но они выходят за рамки данного документа.
Запуск MariaDB
Запустите MariaDB с помощью инструмента systemctl:
systemctl start mariadb
Если вы не используете systemd, вам, возможно, придётся запускать MariaDB с помощью какого-то другого механизма.
Вы должны увидеть журнал вывода, похожий на этот:
# journalctl --no-pager -o cat -u mariadb.service [Note] /usr/sbin/mysqld (mysqld 10.1.9-MariaDB-enterprise-log) starting as process 19831 ... [Note] AWS KMS plugin: generated encrypted datakey for key id=1, version=1 [Note] AWS KMS plugin: loaded key 1, version 1, key length 128 bit [Note] InnoDB: Using mutexes to ref count buffer pool pages [Note] InnoDB: The InnoDB memory heap is disabled [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins [Note] InnoDB: Memory barrier is not used [Note] InnoDB: Compressed tables use zlib 1.2.7 [Note] InnoDB: Using CPU crc32 instructions [Note] InnoDB: Initializing buffer pool, size = 2.0G [Note] InnoDB: Completed initialization of buffer pool [Note] InnoDB: Highest supported file format is Barracuda. [Note] InnoDB: 128 rollback segment(s) are active. [Note] InnoDB: Waiting for purge to start [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.6.26-74.0 started; log sequence number 1616819 [Note] InnoDB: Dumping buffer pool(s) not yet started [Note] Plugin 'FEEDBACK' is disabled. [Note] AWS KMS plugin: generated encrypted datakey for key id=2, version=1 [Note] AWS KMS plugin: loaded key 2, version 1, key length 128 bit [Note] Using encryption key id 2 for temporary files [Note] Server socket created on IP: '::'. [Note] Reading of all Master_info entries succeded [Note] Added new Master_info '' to hash table [Note] /usr/sbin/mysqld: ready for connections.
Обратите внимание на несколько строк вывода, которые явно относятся к «плагину AWS KMS». Вы можете видеть, что плагин генерирует «ключ данных», загружает этот ключ, а затем позже генерирует и загружает второй ключ данных. Второй ключ данных используется для шифрования временных файлов и временных таблиц.
Вы можете увидеть зашифрованные ключи, хранящиеся на диске, в каталоге данных:
# ls -l /var/lib/mysql/aws* -rw-rw----. 1 mysql mysql 188 Feb 25 18:55 /var/lib/mysql/aws-kms-key.1.1 -rw-rw----. 1 mysql mysql 188 Feb 25 18:55 /var/lib/mysql/aws-kms-key.2.1
Обратите внимание, что эти ключи бесполезны сами по себе. Они зашифрованы. Когда MariaDB запускается, плагин AWS KMS расшифровывает эти ключи, взаимодействуя с AWS KMS.
Для максимальной безопасности вы должны начинать с пустого каталога данных и выполнить mariadb-install-db после настройки шифрования. Затем вы должны повторно импортировать свои данные, чтобы они были полностью зашифрованы. Используйте sudo для запуска mariadb-install-db, чтобы он нашёл ваш файл учетных данных:
# sudo -u mysql mariadb-install-db Installing MariaDB/MySQL system tables in '/var/lib/mysql' ... 2016-02-25 23:16:06 139731553998976 [Note] /usr/sbin/mysqld (mysqld 10.1.11-MariaDB-enterprise-log) starting as process 39551 ... 2016-02-25 23:16:07 139731553998976 [Note] AWS KMS plugin: generated encrypted datakey for key id=1, version=1 2016-02-25 23:16:07 139731553998976 [Note] AWS KMS plugin: loaded key 1, version 1, key length 128 bit ...
Создание зашифрованных таблиц
С innodb-encrypt-tables=ON, новые InnoDB-таблицы будут шифроваться по умолчанию, используя идентификатор ключа, заданный в innodb_default_encryption_key_id (по умолчанию 1). При включенном innodb-encrypt-tables=FORCE, вручную обойти шифрование при создании таблицы невозможно.
Вы можете заставить плагин AWS KMS создавать новые ключи шифрования по требованию, указав новый ENCRYPTION_KEY_ID при создании таблицы:
MariaDB [test]> create table t1 (id serial, v varchar(32)) ENCRYPTION_KEY_ID=3; Query OK, 0 rows affected (0.91 sec)
[Note] AWS KMS plugin: generated encrypted datakey for key id=3, version=1 [Note] AWS KMS plugin: loaded key 3, version 1, key length 128 bit
# ls -l /var/lib/mysql/aws* -rw-rw----. 1 mysql mysql 188 Feb 25 18:55 /var/lib/mysql/aws-kms-key.1.1 -rw-rw----. 1 mysql mysql 188 Feb 25 18:55 /var/lib/mysql/aws-kms-key.2.1 -rw-rw----. 1 mysql mysql 188 Feb 25 19:10 /var/lib/mysql/aws-kms-key.3.1
Дополнительную информацию о шифровании данных см. в разделе Шифрование данных в состоянии покоя документации MariaDB.
Справочник по параметрам плагина AWS KMS
-
aws_key_management_master_key_id: Идентификатор основного ключа шифрования AWS KMS Customer Master Key (ARN или псевдоним, начинающийся сalias/) для основного ключа шифрования. Используется для создания новых ключей данных. Если не задано, новые ключи данных не будут созданы. -
aws_key_management_rotate_key: Установите эту переменную в идентификатор ключа данных, чтобы выполнить ротацию ключа к основному ключу, указанному вaws_key_management_master_key_id. Укажите -1 для ротации всех ключей.
-
aws_key_management_key_spec: Алгоритм шифрования, используемый для создания новых ключей. Допустимые значения — AES_128 (по умолчанию) или AES_256. -
aws_key_management_log_level: Ведение журнала для AWS API. Допустимые значения, в порядке возрастания подробности, — «Выключено» (по умолчанию), «Критическая ошибка», «Ошибка», «Предупреждение», «Информация», «Отладка» и «Отслеживание».
Следующие шаги
Для получения дополнительной информации о расширенном использовании, включая стратегии управления учетными данными, обеспечения разделения обязанностей и даже требования к двухфакторной аутентификации для запуска вашего сервера MariaDB, прочитайте Расширенное использование плагина шифрования Amazon Web Services (AWS) Key Management Service (KMS).
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/aws-key-management-encryption-plugin-setup-guide/