Главная » 2017 » Ноябрь » 17 » man 7 keyrings
00:17
man 7 keyrings

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


keyrings - средство управления и хранения ключей в ядре



ОПИСАНИЕ


Средство управления ключами Linux позволяет различным компонентам ядра хранить или
кэшировать охраняемые безопасности, ключи аутентификации, ключи шифрования и
другие данные в ядре.

Через системные вызовы пользовательские программы могут управлять этими объектами,
а также использовать это средство для своих собственных целей; смотрите
add_key(2), request_key(2) и keyctl(2).

Для работы с данными предоставляется библиотека и пользовательские программы.
Подробности смотрите в keyctl(1), keyctl(3) и keyutils(7).

Ключи
Ключ имеет следующие атрибуты:

Серийный номер (ID)
Уникальное целое число, используется в системных вызовах для ссылки на
ключ.

Тип Тип ключа определяет какие данные можно хранить в ключе, как будет
обрабатываться содержимое ключа и как будут использованы полезные (payload)
данные.

Доступно несколько типов ключей общего назначения, а также специальные
типы, определённые компонентами ядра.

Описание (имя)
Описание ключа — пригодная для печати строка, которая используется в
условии поиска ключа (вместе с типом), а также как отображаемое имя. При
поиске описание может совпадать как полностью так и частично.

Полезные данные (payload)
Полезные данные это то, что хранит ключ. Обычно, они указываются при
создании ключа, но возможно, что для завершения создания ядро сделает
запрос в пользовательское пространство, если ключ был неизвестен ядру до
запроса. Подробности смотрите в request_key(2).

Полезные данные ключа можно читать и изменять, если это поддерживается
типом ключа и у вызывающего есть права.

Права доступа
Как и у файлов, каждый ключ содержит ID пользователя-владельца, ID
группы-владельца и метку безопасности. Также каждый ключ имеет набор прав
доступа, хотя и больший чем у обычного файла UNIX, и, дополнительно к ним,
категорию — владельца (possessor) — не являющейся обычным пользователем,
группой и остальными (смотрите Владение ниже).

Заметим, что на ключи действуют квоты, так как для них требуется
невытесняемая память ядра. Квота списывается с пользовательского ID
владельца.

Срок действия
Каждый ключ имеет срок действия. Когда срок заканчивается, ключ помечается
как просроченный и доступ к нему завершается ошибкой EKEYEXPIRED. Если его
сборки мусора.

Типы ключей
Ядро предоставляет несколько основных типов ключей:

"keyring"
Связки ключей — это специальные ключи, которые хранят набор ссылок на
другие ключи (включая другие связки ключей), так же как каталоги хранят
ссылки на файлы. Основное предназначение связки ключей — не дать другим
ключам попасть в мусор по причине того, что они нигде не используются.

Связки ключей с описаниями (именами), которые начинаются с точки ('.'),
зарезервированы для использования реализацией.

"user" Тип ключа общего назначения. Ключ полностью находится в памяти ядра.
Полезные данные можно читать и изменять из пользовательских приложений.

Полезные данные ключей этого типа представляют собой данные произвольной
структуры (blob) размером до 32767 байт.

Для имени можно использовать любую корректную строку, хотя предпочтительно
начинать его с отделяемого двоеточием префикса, представляющего службу,
которой интересен ключ (пример: "afs:mykey").

"logon" (начиная с Linux 3.3)
Данный тип ключа почти такой же как "user", но не предоставляет чтения (т.
е., операции keyctl(2) KEYCTL_READ), и поэтому полезные данные ключа
недоступны из пользовательского пространства. Он подходит для хранения пары
имя пользователя-пароль, которые должны быть недоступны из
пользовательского пространства.

Описание ключа "logon" должно начинатьсяс непустого отделённого двоеточием
префиса; его назначение — обозначить службу, которой принадлежит ключ
(заметим, что это отличается от ключей типа "user", у которых префикс
считается необязательным).

"big_key" (начиная с Linux 3.13)
Данный тип ключа подобен "user", но может содержать полезные данные
размером до 1 МиБ. Он полезен для хранения таких данных как кэш билетов
Kerberos.

Данные полезной нагрузки может сохраняться в файловой системе tmpfs, а не в
памяти ядра, если размер данных превышает накладные расходы на хранение
данных в файловой системе (хранение данных в файловой системе требует
выделения места в ядре под структуры файловой системы. Размер этих структур
определяется размером границы, после которой используется хранение в
tmpfs). Начиная с Linux 4.8, данные полезной нагрузки при хранении в tmpfs
шифруются и, таким образом, не записываются в пространство подкачки в не
шифрованном виде.

Существуют также другие специальные типы ключей, но здесь они не описаны, так как
не предназначены для использования в обычном пользовательском пространстве.

Имена связок ключей, которые начинаются с точки ('.'), зарезервированы для
использования реализацией.

Связки ключей
Ключ может добавляться в связку ключей системным вызовом, создающим ключи.
Это предотвращает немедленное удаление нового ключа после того, как
системный вызов удаляет свою последнюю ссылку на ключ.

Присоединение
В связку ключей может быть добавлена ссылка, которая указывает на уже
известный ключ, при этом контролируется отсутствие ссылок на саму связку.

Отсоединение
Ссылка может быть удалена из связки ключей. При удалении последней ссылки
на ключ, он планируется к удалению сборщиком мусора.

Очистка
Из связки ключей могут удаляться все ссылки.

Поиск Связка ключей может считаться корнем дерева или поддерева в котором связки
ключей считаются ветвями, а обычные ключи — листьями. В таком дереве может
выполнять поиск ключа по типу и описанию.

Подробности смотрите в keyctl_clear(3), keyctl_link(3), keyctl_search(3) и
keyctl_unlink(3).

Закрепляющие ключи
Если ключ не используется ядром, чтобы не быть удалённым сборщиком мусора, он
должен быть закреплён для сохранения положительного значения своего счётчика
ссылок.

Для закрепления ключей используются связки ключей: каждая связь представляет
ссылку на ключ. Заметим, что сами связки ключей — тоже ключи и требуют
закрепления, чтобы не быть удалёнными сборщиком мусора.

В ядре доступно несколько закрепляющих связок ключей. Заметим, что некоторые из
них будут созданы только в момент первого обращения.

Связки ключей процесса
Мандаты процесса являются связками ключей со специальной семантикой. Эти
связки ключей существуют пока существуют мандаты, то есть, обычно, пока
существует процесс.

Существует три связки ключей с различными правилами наследования/общего
пользования: session-keyring(7) (наследуется и используется всеми дочерними
процессами), process-keyring(7) (используется всеми нитями процесса) и
thread-keyring(7) (доступна только определённой нити).

Альтернативой использованию реальных ID связок ключей в вызовах add_key(2),
keyctl(2) и request_key(2) можно указывать значения специальных связок
ключей KEY_SPEC_SESSION_KEYRING, KEY_SPEC_PROCESS_KEYRING и
KEY_SPEC_THREAD_KEYRING, которые ссылаются на экземпляры ключей,
принадлежащие вызывающему.

Пользовательские связки ключей
Для каждого UID, известного ядру, имеется запись, содержащая две связки
ключей: user-keyring(7) и user-session-keyring(7). Они существуют пока в
ядре существует запись UID.

Альтернативой использованию реальных ID связок ключей в вызовах add_key(2),
keyctl(2) и request_key(2) можно указывать значения специальных связок
срок службы устанавливается таким образом, чтобы она автоматически
очищалась после указанного времени. Постоянные связки ключей позволяют,
например, сценариям cron(8) использовать мандаты, остающиеся в постоянной
связке ключей после выхода пользователя.

Заметим, что срок службы постоянной связки ключей сбрасывается каждый раз
после запроса постоянной связки ключей.

Специальные связки ключей
Существуют специальные связки ключей, принадлежащие ядру, которые могут
хранить закрепляющие ключи для специальных целей. Например, system keyring
используется для хранения ключей шифрования для модуля сличения подписи.

Эти специальные связки ключей, обычно, закрыты для прямого изменения из
пользовательского пространства.

Первоначально планировавшиеся «групповые связки ключей» для хранения ключей,
связанных с каждым GID, известным ядру, пока не реализованы, и, вероятно, не
будут. Тем не менее, для этой связки ключей определена константа
KEY_SPEC_GROUP_KEYRING.

Владение (possession)
Концепция владения важна для понимания модели безопасности связки ключей. Владеет
ли нить ключом определяется следующими правилами:

(1) Ключ или связка ключей, на которую у вызывающего нет права поиска,
игнорируется во всех последующих правилах.

(2) Нить непосредственно владеет своими session-keyring(7), process-keyring(7) и
thread-keyring(7), так как на эти связки ключей есть ссылка из её мандатов.

(3) Если связкой ключей кто-то владеет, то он владеет всеми ключами в связке.

(4) Если ключ в связке связан сам с собой в связке, то правило (3) применяется
рекурсивно.

(5) Если процесс вызван из ядра для создания ключа (смотрите request_key(2)), то
оно также владеет связкой ключей вызвавшего как в правиле (1) если бы он был
вызывающим.

Заметим, что владение не является фундаментальным свойством ключа и вычисляется
каждый раз при необходимости.

Механизм владения разработан для того, что бы программы с set-user-ID,
запускаемые, например, из оболочки, имели доступ к пользовательским ключам.Права
предоставляются владельцу ключа, в то время как доступ к ключам по UID и GID ключа
не дают такого доступа.

Когда создаётся связка ключей сеанса, pam_keyinit(8) добавляет связь с
user-keyring(7), то есть по умолчанию даёт право владения пользовательской связкой
ключей и всем её содержимым.

Права доступа
Каждый ключ имеет следующие атрибуты, относящиеся к безопасности:

* Пользовательский идентификатор владельца


пользователь
Набор предоставляемых прав, если пользовательский ID ключа совпадает с
пользовательским ID вызывающего из файловой системы.

группа Набор предоставляемых прав, если пользовательский ID ключа не совпадает и
групповой ID ключа совпадает с GID вызывающего из файловой системы или
одним из GID его дополнительных групп.

остальные
Набор предоставляемых прав, если не совпадает ни пользовательский ID, ни
групповой ID ключа.

Четвёртый набор прав:

владелец
Набор предоставляемых прав, если определено, что ключом владеет вызывающий.

Полный набор прав на ключ представляет собой объединение одного из первых трёх
наборов и четвёртого набор, если для ключа задано владение.

Набор прав, который может быть предоставлен каждой из четырёх масок:

просмотр
Для чтения доступны атрибуты ключа. К ним относятся тип, описание и права
доступа (кроме метки безопасности).

чтение Для ключа: можно читать полезные данные ключа. Для связки ключей: можно
читать список серийных номеров (ключей), с которыми связка ключей имеет
связь.

запись Можно изменять полезные данные и отзывать ключ. Для связки ключей: можно
добавлять и удалять связи из связки ключей, а также полностью очищать
связку ключей (удаление всех связей).

поиск Для ключа (или связки ключей): ключ можно найти поиском. Для связки ключей:
можно найти ключи и связки ключей, связанные в связку ключей.

связь Из связки ключей можно установить связь с ключом. Для начальной связи с
ключом, устанавливаемой при создании ключа, этого не требуется.

установка атрибутов
Можно изменять атрибуты владения и метку безопасности, задавать срок
действия ключа и отзывать ключ.

Кроме прав, доступ к ключа также быть заблокирован любым активным модулем
безопасности Linux(LSM), если это прописано в его политике. Ключу LSM может
назначить метку безопасности или другой атрибут; эту метку можно получить с
помощью keyctl_get_security(3).

Подробности смотрите в keyctl_chown(3), keyctl_describe(3),
keyctl_get_security(3), keyctl_setperm(3) и selinux(8).

Поиск ключей
Одним из основных свойств управления ключами Linux является возможность поиска
ключей, хранимых процессом. Системный вызов request_key(2) является основным
методом для приложений пользовательского пространства для поиска ключа (для
(2) Если вызывающий является процессом, который был вызван механизмом верхнего
вызова 9upcall) request_key(2), то связки ключей первоначального вызывающего
также будут просматриваться request_key(2).

(3) Поиск в дереве связки ключей выполняется «сначала вширь»: в каждой связка
ключей просматривается до первого совпадения, затем просматриваются связки
ключей, на которые ссылается эта связка ключей.

(4) Если найденный ключ действителен, то поиск завершается и возвращается этот
ключ.

(5) Если найденный ключ находится в состоянии ошибки, то это состояние ошибки
запоминается и поиск продолжается.

(6) Если действительный ключ не найден, то возвращается первое запомненное
состояние ошибки; в противном случае возвращается ошибка ENOKEY.

Также можно проводить поиск в определённой связке ключей, в этом случае
выполняются только шаги с (3) по (6).

Подробности смотрите в request_key(2) и keyctl_search(3).

Создание ключа по требованию
Если ключ невозможно найти, то request_key(2), если указан аргумент callout_info,
создаст новый ключ и затем сделает вызов в пользовательское пространство для его
инициализации. Это позволяет создавать ключи только при необходимости.

Как правило, при этом ядро создаёт новый процесс с выполняемой программой
request-key(8), которая, в свою очередь, запустит соответствующий обработчик в
соответствии со своими настройками.

Обработчику передаётся специальный ключ авторизации, который позволяет только
этому обработчику инициализировать новый ключ. Он также используется для
разрешения поиска, выполняемого программой-обработчиком, в связках ключах
запрашивающего.

Подробности смотрите в request_key(2), keyctl_assume_authority(3),
keyctl_instantiate(3), keyctl_negate(3), keyctl_reject(3), request-key(8) и
request-key.conf(5).

Файлы в /proc
Ядро предоставляет в /proc различные файлы, через которые отображается информацию
о ключах и определяются ограничения на использование ключей.

/proc/keys (начиная с Linux 2.6.10)
Этот файл отображает список ключей, на которые у читающей нити есть право
просмотра, предоставляя различную информацию о каждом ключе. От нити не
требуется владения ключом, чтобы он был видим в этом файле.

В этот список включаются только те ключи, на которые у читающего процесса
есть право просмотра (независимо от того, владеет он ими или нет). Проверки
безопасности LSM также выполняются и могут отфильтровать какие-то ключи,
которые процесс не авторизован просматривать.

Пример содержимого этого файла (колонки пронумерованы для ссылок далее):

(1) (2) (3)(4) (5) (6) (7) (8) (9)

Поля каждой строки в этом файле имеют следующее назначение:

Идентификатор (1)
Идентификатор (серийный номер) ключа (шестнадцатеричное число).

Флаги (2)
Набор флагов, описывающих состояние ключа:

I Ключ инициализирован.

R Ключ отозван.

D Ключ бездействующий (dead, т. .е, имеет незарегистрированный тип
ключа. Ключ может ненадолго находиться в этом состоянии при
сборе мусора).

Q Ключ обеспечивает пользовательские квоты.

U Ключ в состоянии создания через обратный вызов в
пользовательское пространство; смотрите request-key(2).

N Ключ инициализирован негативно.

i Ключ признан недействительным.

Использование (3)
Счётчик количества структур мандатов ядра, которые привязали
(pinning) ключ (приблизительный: количество нитей и открытых
файловых ссылок, ссылающихся на этот ключ).

Время ожидания (4)
Количество времени до истечения срока действия ключа, выражается в
человеко-читаемой форме (недели, дни, часы, минуты и секунды).
Строка perm здесь означает, что ключ постоянный (бессрочный). Строка
expd означает, что срок действия ключа уже истёк, но ключ ещё не
удалён сборщиком мусора.

Права доступа (5)
Права доступа к ключу, выражается в виде четырёх шестнадцатеричных
байт содержащий, слева направо, владельца, пользователя, группу и
права остальных. Внутри каждого байта значения битов прав следующие:

0x01 просмотр
Ox02 чтение
0x04 запись
0x08 поиск
0x10 связь
0x20 установка атрибутов

UID (6)
Пользовательский идентификатор владельца ключа.

GID (7)
Идентификатор группы ключа. Значение -1 здесь означает, что у ключа
нет идентификатора группы; это может быть при определённых
обстоятельствах когда ключ создаётся ядром.

Подполе имя это описание ключа (название). Необязательное поле
дополнительная информация содержит некую расширенную информацию о
ключе. Информация здесь зависит от типа ключа:

"user" и "logon"
Размер полезных данных ключа в байтах (десятичное число).

"keyring"
Количество ключей привязанных в связку ключей или строка empty,
если в связке нет ключей.

"big_key"
Размер полезных данных в байтах, указывается или за строкой
[file], если полезные данные ключа превышают порог и хранятся в
(вытесняемой на диск) файловой системе tmpfs(5), или за строкой
[buff], если ключ слишком мал и хранится в памяти ядра.

Для типа ключа ".request_key_auth" (ключ авторизации; смотрите
request_key(2)) поле описания имеет вид, показанный в этом примере:

key:c9a9b19 pid:28880 ci:10

Значения трёх подполей:

key Шестнадцатеричный идентификатор ключа, инициализируемый в
запрашивающей программе.

pid Значение PID запрашивающей программы.

ci Размер исходящих данных (callout data), которые должны быть
размещены в запрашиваемом ключе (т. е., размер полезных данных,
связанных с ключом авторизации).

/proc/key-users (начиная с Linux 2.6.10)
В этом файле содержится различная информация по каждому пользовательскому
ID, который имеет хотя бы один ключ в системе. Пример данных из этого
файла:

0: 10 9/9 2/1000000 22/25000000
42: 9 9/9 8/200 106/20000
1000: 11 11/11 10/200 271/20000

Поля каждой строки имеют следующее назначение:

uid Пользовательский идентификатор.

usage Внутренний счётчик использования в ядре для структуры ядра с
записями пользовательских ключей.

nkeys/nikeys
Общее количество ключей, принадлежащих пользователю, и количество
инициализированных среди этих ключей.

qnkeys/maxkeys
Количество ключей, принадлежащих пользователю, и максимальное
количество ключей, которое может принадлежать пользователю.

этого интервала является создание временного окна, в течении которого
пользовательское пространство может видеть ошибку (EKEYREVOKED и
EKEYEXPIRED, соответственно), которая указывает что случилось с ключом.

Значение по умолчанию равно 300 (т. е., 5 минут).

/proc/sys/kernel/keys/persistent_keyring_expiry (начиная с Linux 3.13)
В этом файле указывается интервал в секундах, в который таймер срока
годности постоянных связок ключей сбрасывается каждый раз при доступен к
связке ключей (через операцию keyctl_get_persistent(3) или keyctl(2)
KEYCTL_GET_PERSISTENT).

Значение по умолчанию равно 259200 (т. е., 3 дня).

Следующие файлы (которые могут изменяться привилегированными процессами)
используются задания квот на количестве ключей и байт данных, которые могут
храниться в полезных данных ключей:

/proc/sys/kernel/keys/maxbytes (начиная с Linux 2.6.26)
Максимальное количество байт данных, которое непривилегированный
пользователь может держать в полезных данных принадлежащих ему ключей.

Значение по умолчанию равно 20000.

/proc/sys/kernel/keys/maxkeys (начиная с Linux 2.6.26)
Максимальное количество ключей, которое может принадлежать
непривилегированному пользователю.

Значение по умолчанию равно 200.

/proc/sys/kernel/keys/root_maxbytes (начиная с Linux 2.6.26)
Максимальное количество байт данных, которое привилегированный пользователь
(с UID 0 в корневом пространстве имён пользователя) может держать в
полезных данных принадлежащих ему ключей.

Значение по умолчанию равно 25000000 (20000 до Linux 3.17).

/proc/sys/kernel/keys/root_maxkeys (начиная с Linux 2.6.26)
Максимальное количество ключей, которое может принадлежать
привилегированному (с UID 0 в корневом пространстве имён пользователя)
пользователю.

Значение по умолчанию равно 1000000 (200 до Linux 3.17).

При использовании связок ключей обратите внимание, что на каждую связь в связке
ключей тратится 4 байта из полезных данных связки ключей.

Пользователи
Система управления ключами Linux содержит некоторое количество пользователей и
свойств, но не ограничивается только ими.

Ядерные пользователи этого свойства:

Сетевые файловые системы — DNS
Ядро использует механизм внешнего вызова (upcall), предоставляемый ключами,
из пользовательского пространства для выполнения поиска в DNS и кэширования
результатов.
идентификаторов сторонних пользователей в идентификаторы локальных
пользователей.

CIFS — пароль
Файловая система CIFS используется ключи для хранения паролей доступа к
удалённым общим ресурсам.

Поверка модуля
Процесс сборки ядра может криптографически подписывать модули. В
последствии эта подпись проверяется при загрузке модуля.

Пользователи пространства пользователя этого свойства:

Хранилище ключей Kerberos
Средство MIT Kerberos 5 (libkrb5) может использовать ключи для хранения
токенов аутентификации, которые при задании времени могут автоматически
очищаться после последнего обращения пользователя, но оставаться даже после
выхода пользователя для того, чтобы их можно было использовать из сценариев
cron(8).



СМОТРИТЕ ТАКЖЕ


keyctl(1), add_key(2), keyctl(2), request_key(2), keyctl(3), keyutils(7),
persistent-keyring(7), process-keyring(7), session-keyring(7), thread-keyring(7),
user-keyring(7), user-session-keyring(7), pam_keyinit(8), request-key(8)

Файл дерева исходного кода ядра Documentation/crypto/asymmetric-keys.txt и все в
каталоге Documentation/security/keys (или, до Linux 4.13, файл
Documentation/security/keys.txt).



Категория: (7) Различные описания, соглашения и прочее | Просмотров: 207 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar