Журнал LinuxFormat - перейти на главную

LXF99:Аутентификация

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Часть 1: Знакомимся с PAM)
 
(не показаны 8 промежуточных версий 2 участников)
Строка 1: Строка 1:
===Эксперименты c PAM===
+
[[Категория:Учебники]]
 +
=== Эксперименты c PAM ===
  
 
Вы можете и не подозревать о существовании аутентификации, потому что она «просто работает». А вот как она работает? '''Д-р Крис Браун''' расскажет.
 
Вы можете и не подозревать о существовании аутентификации, потому что она «просто работает». А вот как она работает? '''Д-р Крис Браун''' расскажет.
  
PAM (Pluggable Authentication Modules подключаемые модули аутентификации) один из тех темных закоулков Linux, куда       большинство пользователей заглянуть не решается. Я даже готов побиться об заклад, что большинство пользователей не знают, что это такое. Однако PAM в сердце каждой программы, так или иначе связанной с аутентификацией. Добро пожаловать на экскурсию по PAM! Заходите в нашу научную лабораторию, выполните наши экспе рименты (горелка Бунзена не потребуется!), и вы увидите, что PAM предоставляет тонкий контроль над политикой безопасности.
+
PAM (Pluggable Authentication Modules подключаемые модули аутентификации) один из тех темных закоулков Linux, куда большинство пользователей заглянуть не решается. Я даже готов побиться об заклад, что большинство пользователей не знают, что это такое. Однако PAM в сердце каждой программы, так или иначе связанной с аутентификацией. Добро пожаловать на экскурсию по PAM! Заходите в нашу научную лабораторию, выполните наши экспе рименты (горелка Бунзена не потребуется!), и вы увидите, что PAM предоставляет тонкий контроль над политикой безопасности.
  
В '''LXF83''' была статья Грэма Моррисона, в которой он провел обзор PAM и продемонстрировал ее гибкость, показав, как с ее помощью расширить аутентификацию пользователя в Linux, используя цифровой ключ, записанный на USB-брелок. В этом месяце мы пойдем дальше и рассмотрим более существенное повышение безопасности системы с помощью PAM. Те из вас, кто настриг '''LXF83''' на мелкие кусочки и использовал их как подстилку в клетке своего хомячка, и те, кто просто не покупал этот номер, не переживайте: в первом разделе мы проведем небольшой обзор PAM, а в детали углубимся во втором.
+
В [[LXF83:Hardcore Linux|LXF83]] была статья Грэма Моррисона, в которой он провел обзор PAM и продемонстрировал ее гибкость, показав, как с ее помощью расширить аутентификацию пользователя в Linux, используя цифровой ключ, записанный на USB-брелок. В этом месяце мы пойдем дальше и рассмотрим более существенное повышение безопасности системы с помощью PAM. Те из вас, кто настриг [[LXF83:Hardcore Linux|LXF83]] на мелкие кусочки и использовал их как подстилку в клетке своего хомячка, и те, кто просто не покупал этот номер, не переживайте: в первом разделе мы проведем небольшой обзор PAM, а в детали углубимся во втором.
  
====Часть 1: Знакомимся с PAM====
+
==== Часть 1: Знакомимся с PAM ====
  
[[Изображение:LXF99_PAM1.jpg|Рис. 1. Архитектура PAM и взаимосвязь ее частей.]]
+
[[Изображение:LXF99 PAM1.jpg|Рис. 1. Архитектура PAM и взаимосвязь ее частей.]]
  
PAM это каркас, помогающий приложениям выполнять то, что я называю «действиями, связанными с аутентификацией». PAM состоит из библиотеки (''libpam'') и набора модулей PAM, которые находятся в папке '''/lib/security''' и представляют собой динамически загружаемые библиотеки (.so). Каждый модуль служит для решения определенной задачи, и приложения, связанные с PAM, обычно используют стек из нескольких модулей. Общая архитектура показана на рис. 1. PAM определяет четыре типа действий, относящихся к аутентификации:
+
PAM это каркас, помогающий приложениям выполнять то, что я называю «действиями, связанными с аутентификацией». PAM состоит из библиотеки (''libpam'') и набора модулей PAM, которые находятся в папке '''/lib/security''' и представляют собой динамически загружаемые библиотеки (.so). Каждый модуль служит для решения определенной задачи, и приложения, связанные с PAM, обычно используют стек из нескольких модулей. Общая архитектура показана на рис. 1. PAM определяет четыре типа действий, относящихся к аутентификации:
  
* '''auth''' наиболее очевидное действие: вы удостоверяете свою личность, предоставляя некоторый набор реквизитов. Обычно это имя пользователя и пароль, но возможны и другие варианты: например, физический ключ (как в '''LXF83'''), а то и биометрические методы, вроде отпечатков пальцев или сканирования сетчатки глаза.
+
* '''auth''' наиболее очевидное действие: вы удостоверяете свою личность, предоставляя некоторый набор реквизитов. Обычно это имя пользователя и пароль, но возможны и другие варианты: например, физический ключ (как в [[LXF83:Hardcore Linux|LXF83]]), а то и биометрические методы, вроде отпечатков пальцев или сканирования сетчатки глаза.
* '''account''' действия, определяющие, можно ли вам зайти в систему (теперь, когда мы уже знаем, кто вы). К этой категории можно отнести, например, модуль PAM, ограничивающий вход пользователей в систему в зависимости от времени суток.
+
* '''account''' действия, определяющие, можно ли вам зайти в систему (теперь, когда мы уже знаем, кто вы). К этой категории можно отнести, например, модуль PAM, ограничивающий вход пользователей в систему в зависимости от времени суток.
* '''session''' действия по выделению ресурсов, которые могут потребоваться пользователю во время сессии, например, монтирование домашнего каталога пользователя, установка лимитов на использование ресурсов системы, вывод ежедневного сообщения и т.д.
+
* '''session''' действия по выделению ресурсов, которые могут потребоваться пользователю во время сессии, например, монтирование домашнего каталога пользователя, установка лимитов на использование ресурсов системы, вывод ежедневного сообщения и т. д.
* '''password''' действия по обновлению реквизитов пользователя (обычно пароля).
+
* '''password''' действия по обновлению реквизитов пользователя (обычно пароля).
  
 
Для краткости в дальнейшем я буду называть эти действия «задачами PAM».
 
Для краткости в дальнейшем я буду называть эти действия «задачами PAM».
  
===Какие программы используют PAM?===
+
===== Какие программы используют PAM? =====
  
 
Да любые, которым нужно аутентифицировать пользователей, управлять их входом в систему, выделять им ресурсы или обновлять реквизиты: использование PAM значительно облегает им жизнь. Очевидные примеры:
 
Да любые, которым нужно аутентифицировать пользователей, управлять их входом в систему, выделять им ресурсы или обновлять реквизиты: использование PAM значительно облегает им жизнь. Очевидные примеры:
  
* ''login'' программа входа в текстовый терминал.
+
* ''login'' программа входа в текстовый терминал.
* ''gdm'' вход в графический рабочий стол.
+
* ''gdm'' вход в графический рабочий стол.
* ''su'' запуск оболочки от имени нового пользователя.
+
* ''su'' запуск оболочки от имени нового пользователя.
* ''passwd'' задание нового пароля.
+
* ''passwd'' задание нового пароля.
 +
 
 +
[[Изображение:LXF99 PAM2.jpg|Рис. 2: Синтаксис файла конфигурации PAM.]]
  
 
Преимущество PAM в том, что «действия, связанные с аутентификацией», не привязаны к приложению, которое их использует. Благодаря этому гораздо проще менять политику безопасности или добавлять новые механизмы аутентификации: достаточно просто перенастроить PAM. Раньше для этого могло потребоваться изменение исходного кода самих приложений. Стек модулей, с помощью которых каждое приложение с аутентификацией через PAM выполняет одно из четырех соответствующих действий, определяется в файле конфигурации приложения, расположенном в каталоге '''/etc/pam.d'''. Имя файла соответствует имени приложения: например, файл '''/etc/pam.d/sshd''' содержит настройки PAM для программы ''sshd''. На рис. 2 показана одна из строк такого файла. Эта строка добавляет к стеку '''auth''' модуль '''pam_unix.so'''. При необходимости приложение может сформировать все четыре стека (по одному для каждого из типов действий PAM), однако для большинства приложений достаточно двух.
 
Преимущество PAM в том, что «действия, связанные с аутентификацией», не привязаны к приложению, которое их использует. Благодаря этому гораздо проще менять политику безопасности или добавлять новые механизмы аутентификации: достаточно просто перенастроить PAM. Раньше для этого могло потребоваться изменение исходного кода самих приложений. Стек модулей, с помощью которых каждое приложение с аутентификацией через PAM выполняет одно из четырех соответствующих действий, определяется в файле конфигурации приложения, расположенном в каталоге '''/etc/pam.d'''. Имя файла соответствует имени приложения: например, файл '''/etc/pam.d/sshd''' содержит настройки PAM для программы ''sshd''. На рис. 2 показана одна из строк такого файла. Эта строка добавляет к стеку '''auth''' модуль '''pam_unix.so'''. При необходимости приложение может сформировать все четыре стека (по одному для каждого из типов действий PAM), однако для большинства приложений достаточно двух.
 +
 +
{{Врезка
 +
    |Заголовок=Скорая помощь
 +
    |Содержание=Если вы что-то напутаете с настройкой PAM, то запросто можете захлопнуть дверь в свою квартиру, капитально запретив любой вход в систему, даже для администратора. Поэтому сохраните копию исходных файлов конфигурации ''pam'', и будьте готовы выполнить экстренную загрузку, если понадобится их восстановить.
 +
    |Ширина=200px}}
  
 
Итак, основная идея такова: когда приложению надо выполнить одно из действий PAM, оно обращается к библиотеке PAM. Затем библиотека по очереди вызывает все модули в этом стеке. Каждый модуль «делает свое дело» и возвращает библиотеке положительный или отрицательный результат. Библиотека объединяет результаты модулей в результат для стека в целом, который возвращается приложению. Способ объединения определяется управляющим флажком модуля, прописанным во втором поле строки в файле настроек. Возможные значения флажка:
 
Итак, основная идея такова: когда приложению надо выполнить одно из действий PAM, оно обращается к библиотеке PAM. Затем библиотека по очереди вызывает все модули в этом стеке. Каждый модуль «делает свое дело» и возвращает библиотеке положительный или отрицательный результат. Библиотека объединяет результаты модулей в результат для стека в целом, который возвращается приложению. Способ объединения определяется управляющим флажком модуля, прописанным во втором поле строки в файле настроек. Возможные значения флажка:
 
* '''requisite''' Если модуль завершается с ошибкой, PAM немедленно возвращает приложению ошибку, другие модули стека не вызываются.
 
* '''requisite''' Если модуль завершается с ошибкой, PAM немедленно возвращает приложению ошибку, другие модули стека не вызываются.
* '''required''' Если модуль завершается с ошибкой, PAM возвращает ошибку приложению, но продолжает вызывать остальные модули стека. (Кто не в силах запомнить разницу между '''requisite''' и '''required''', вступайте в спецклуб! Я уже в нем...)
+
* '''required''' Если модуль завершается с ошибкой, PAM возвращает ошибку приложению, но продолжает вызывать остальные модули стека. (Кто не в силах запомнить разницу между '''requisite''' и '''required''', вступайте в спецклуб! Я уже в нем…)
 
* '''sufficient''' Если модуль завершается успешно, PAM возвращает приложению результат «выполнен», и остальные модули стека не вызываются. (Конечно, предполагается, что никакой модуль с флажком '''required''' выше в стеке не отказал.)
 
* '''sufficient''' Если модуль завершается успешно, PAM возвращает приложению результат «выполнен», и остальные модули стека не вызываются. (Конечно, предполагается, что никакой модуль с флажком '''required''' выше в стеке не отказал.)
* '''optional''' Результат работы модуля (выполнен/ошибка) игнорируется. Обычно это означает, что модуль вызывается для выполнения некой операции, не имеющей отношения к принятию решения «пропустить/отказать» для всего стека. Например, модуль '''pam_keyinit''' «необязательный» модуль для ''sshd'', он создает новый «ключ сессии» для нового пользователя.
+
* '''optional''' Результат работы модуля (выполнен/ошибка) игнорируется. Обычно это означает, что модуль вызывается для выполнения некой операции, не имеющей отношения к принятию решения «пропустить/отказать» для всего стека. Например, модуль '''pam_keyinit''' «необязательный» модуль для ''sshd'', он создает новый «ключ сессии» для нового пользователя.
 +
 
 +
{{Врезка
 +
    |Заголовок=Использует ли программа PAM?
 +
    |Содержание=Как узнать, использует ли PAM та или иная программа? Ну, первый способ – посмотреть на файлы конфигурации в '''/etc/pam.d.''' Теоретически это подскажет нам ответ. Способ похитрее – посмотреть, скомпонована ли программа с библиотекой PAM. Это можно сделать с помощью следующей команды:
 +
 
 +
<code>
 +
$ ldd /bin/login <nowiki>|</nowiki> grep libpam
 +
libpam.so.0 => /lib/libpam.so.0
 +
(0xb7f47000)
 +
libpam_misc.so.0 => /lib/libpam_misc.so.0
 +
(0xb7f43000)
 +
</code>
 +
если вывод похож на этот, программа использует PAM. Если вывод отсутствует – нет.
 +
    |Ширина=400px}}
  
 
(Последние версии PAM поддерживают получение более подробного результата выполнения модуля, чем просто «выполнен/ошибка», и более сложный синтаксис для задания способа объединения отдельных результатов. Подробности можно найти на man-странице '''pam.conf''', если она есть. Однако и этого простейшего отчета вполне достаточно.) В качестве управляющего флажка также может использоваться ключевое слово '''include'''. Эта ситуация немного отличается от других. Она предписывает PAM подключить некоторый предопределенный стек модулей (в терминах программирования это можно назвать вызовом подпрограммы). Это позволяет «вынести за скобку» наиболее общие действия PAM (например, общие стеки модулей), в отдельный файл. Например, в RHEL5 вы заметите, что во многих файлах конфигурации PAM подключен стек, определенный в файле '''system-auth'''. В Ubuntu 7.04 имеются четыре файла для аналогичной цели: '''common-auth, common-account, common-session''' и '''common-passwd'''. В Red Hat также есть своего рода «метамодуль» '''pam_stack''', который выполняет стек модулей, определенных в отдельном файле.
 
(Последние версии PAM поддерживают получение более подробного результата выполнения модуля, чем просто «выполнен/ошибка», и более сложный синтаксис для задания способа объединения отдельных результатов. Подробности можно найти на man-странице '''pam.conf''', если она есть. Однако и этого простейшего отчета вполне достаточно.) В качестве управляющего флажка также может использоваться ключевое слово '''include'''. Эта ситуация немного отличается от других. Она предписывает PAM подключить некоторый предопределенный стек модулей (в терминах программирования это можно назвать вызовом подпрограммы). Это позволяет «вынести за скобку» наиболее общие действия PAM (например, общие стеки модулей), в отдельный файл. Например, в RHEL5 вы заметите, что во многих файлах конфигурации PAM подключен стек, определенный в файле '''system-auth'''. В Ubuntu 7.04 имеются четыре файла для аналогичной цели: '''common-auth, common-account, common-session''' и '''common-passwd'''. В Red Hat также есть своего рода «метамодуль» '''pam_stack''', который выполняет стек модулей, определенных в отдельном файле.
  
Теперь, получив представление о том, как модули PAM связаны друг с другом, вы, возможно, захотите взглянуть на большую таблицу в конце этой статьи, где описаны модули, используемые чаще всего. Учтите, что некоторых модулей может не быть в вашем дистрибутиве, и, наоборот, вам могут попасться модули, которых нет в этой таблице. Поскольку Linux открытая система и прочее, ребята понаписали всяких-разных модулей PAM. Некоторые ссылки можно найти на странице http://www.kernel.org/pub/linux/libs/pam/modules.html.
+
Теперь, получив представление о том, как модули PAM связаны друг с другом, вы, возможно, захотите взглянуть на большую таблицу в конце этой статьи, где описаны модули, используемые чаще всего. Учтите, что некоторых модулей может не быть в вашем дистрибутиве, и, наоборот, вам могут попасться модули, которых нет в этой таблице. Поскольку Linux открытая система и прочее, ребята понаписали всяких-разных модулей PAM. Некоторые ссылки можно найти на странице http://www.kernel.org/pub/linux/libs/pam/modules.html.
  
 
Ниже приведены шесть экспериментов с изменением настроек PAM. Ни один из них сам по себе особенно не впечатляет, но я надеюсь, что они придадут вам достаточно уверенности в себе и понимания работы PAM, чтобы начать свои собственные эксперименты.
 
Ниже приведены шесть экспериментов с изменением настроек PAM. Ни один из них сам по себе особенно не впечатляет, но я надеюсь, что они придадут вам достаточно уверенности в себе и понимания работы PAM, чтобы начать свои собственные эксперименты.
 +
 +
{{Врезка
 +
    |Заголовок=Документация PAM
 +
    |Содержание=Возможно, вам придется немного покопаться, чтобы найти документацию на PAM, потому что в разных дистрибутивах она хранится в разных местах. Например, в RHEL5 man-страницы для модулей PAM входят в основной пакет PAM; в Ubuntu документация находится в каталоге '''/usr/share/doc/libpam-doc''' и является частью пакета ''libpam-doc'', который нужно устанавливать отдельно. Если вы найдете файл под названием Linux-PAM System Administrators' Guide, это отличное начало. Если локальной копии нет, ее можно скачать на странице http://kernel.org/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html.
 +
    |Ширина=500px}}
 +
 +
==== Часть 2: Экспериментируем с PAM ====
 +
 +
===== Позволим всем пользователям переключаться в root без пароля через su. =====
 +
'''Что делать:''' Замените все строки файла '''/etc/pam.d/su''', относящиеся к стеку '''auth''', единственной строкой:
 +
 +
<code>
 +
auth sufficient pam_permit.so
 +
</code>
 +
 +
'''Как проверить:''' Зайдите в систему как обычный пользователь и проверьте, что можете переключиться в root с помощью su без ввода пароля. Это может показаться рисковым, но все же менее опасно, чем разрешить пользователям сразу заходить в систему с привилегиями администратора. Например, вы можете зайти в систему как обычный пользователь, а затем выполнить команду
 +
 +
<code>
 +
$ su -c "date 09201155"
 +
</code>
 +
 +
чтобы установить системное время (действие, требующее привилегий администратора).
 +
 +
===== Запретим всем пользователям использовать su =====
 +
 +
'''Что делать:''' Оставьте в файле '''/etc/pam.d/su''' только одну строку, относящуюся к стеку '''auth''':
 +
 +
<code>
 +
auth requisite pam_deny.so
 +
</code>
 +
 +
'''Как проверить:''' Зайдите в систему как обычный пользователь и убедитесь, что переключения в режим администратора не происходит: у вас даже не спрашивают пароль. Конечно, можно запретить su, и сняв права на выполнение файла самой программы. Хотя отключение ''su'' на первый взгляд повышает безопасность системы, на деле вы вынуждаете администратора всегда заходить в систему как root, вместо кратковременного переключения в '''root''' для действий с высшими привилегиями.
 +
 +
===== Разрешим su только пользователям из некоторой группы =====
 +
 +
'''Что делать:''' Для начала нам нужен хотя бы один пользователь в этой группе — назовем ее, например, '''wheel'''. Чтобы добавить пользователя '''chris''' в группу '''wheel''', выполните следующую команду от имени администратора:
 +
 +
<code>
 +
# usermod -G wheel chris
 +
</code>
 +
 +
Теперь отредактируйте файл /etc/pam.d/su, чтобы стек auth выглядел следующим образом:
 +
 +
<code>
 +
auth sufficient pam_rootok.so
 +
auth required pam_wheel use_uid
 +
auth include system-auth
 +
</code>
 +
 +
'''Как проверить:''' Зайдите в систему как '''chris''' (или как любой другой пользователь из группы '''wheel''') и попробуйте использовать ''su''. Будет запрошен пароль администратора, после чего должен открыться сеанс администратора. Теперь попробуйте зайти в систему под другим пользователем — не членом группы '''wheel''', и сделать то же самое. Снова будет запрошен пароль администратора, но переключиться в сеанс '''root''' не удастся. Можете попробовать изменить управляющий флажок для модуля '''pam_wheel''' в '''requisite''' — для этого измените строку в файле '''/etc/pam.d/su''':
 +
 +
<code>
 +
auth requisite pam_wheel use_uid
 +
</code>
 +
 +
'''Вопрос на засыпку:''' какое произойдет изменение? Проверьте себя. Ну что, начали понимать, как настройки PAM формируют политику безопасности?
 +
 +
===== Запретим вход в систему как root =====
 +
 +
Идея здесь в том, чтобы пользователи не могли войти в систему как администраторы: то есть зайти в систему придется как обычному пользователю, а затем переключиться в режим '''root''' с помощью ''su''. (Предварительно убедитесь, что есть хотя бы один пользователь, имеющий на это право, не то вы заблокируете компьютер.) Нам нужно запретить вход как на виртуальные терминалы, так и на графический рабочий стол.
 +
 +
'''Что делать''': Чтобы запретить вход на виртуальные терминалы, добавьте в файл '''/etc/pam/d/login''' строку
 +
 +
<code>
 +
auth required pam_securetty.so
 +
</code>
 +
 +
на верхушку стека '''auth''' (может быть, она уже есть там). Как мы уже видели, этот модуль запрещает вход в систему от имени '''root''' на терминалах, которых нет в списке '''/etc/securetty'''. Теперь мы можем очистить этот список с помощью пары команд:
 +
 +
<code>
 +
# cp /etc/securetty /etc/securetty.saved
 +
# echo "" > /etc/securetty
 +
</code>
 +
 +
(Обратите внимание, что пустой файл '''/etc/securetty''' и отсутствие этого файла — совсем не одно и то же. В первом случае запрещается вход под '''root''' на все терминалы, а во втором, наоборот, разрешается.) Далее, чтобы запретить вход от имени root в графический рабочий стол, добавьте ту же самую строку в стек auth в файле '''/etc/pam.d/gdm'''.
 +
 +
'''Как проверить:''' Попытайтесь зайти в систему как '''root''' (с правильным паролем) — и через виртуальный терминал, и через графический рабочий стол. Обе попытки должны потерпеть неудачу. Убедитесь, что вы можете зайти в систему как обычный пользователь. Обратите внимание, что если прибавить к этому '''Эксперимент 3''', безопасность системы существенно повысится, потому что для получения доступа администратора придется сначала зайти в систему как пользователь из группы '''wheel''', а затем открыть сеанс администратора через ''su''. Даже пронюхав пароль администратора, взломщик не получит его привилегий.
 +
 +
===== Используем сложные пароли =====
 +
 +
В этом эксперименте мы используем модуль '''pam_passwdqc''' стека '''password''', чтобы заставить пользователей назначать сложные пароли. (Это сработает только в том случае, когда пользователь задает или изменяет свой пароль, и не позволит выявить «слабости» уже действующих паролей.)
 +
 +
[[Изображение:LXF99 PAM3.jpg|Рис. 3: Параметры модуля pam_passwdqc.]]
 +
 +
'''Приемлем ли пароль?'''
 +
{| class="wikitable"
 +
|-
 +
! Пароль
 +
! Длина
 +
! Tипов символов
 +
! ОК?
 +
|-
 +
| monpiastoria
 +
| 12
 +
| 1
 +
| Да
 +
|-
 +
| LinuxFormat
 +
| 11
 +
| 2
 +
| Да
 +
|-
 +
| beld*Grob
 +
| 9
 +
| 3
 +
| Да
 +
|-
 +
| 4Me+You
 +
| 7
 +
| 4
 +
| Да
 +
|-
 +
| splodgerat
 +
| 10
 +
| 1
 +
| Нет
 +
|-
 +
| Four+five
 +
| 9
 +
| 2
 +
| Нет †
 +
|-
 +
| gosH!!2
 +
| 7
 +
| 3
 +
| Нет *
 +
|-
 +
| x4Z!
 +
| 4
 +
| 4
 +
| Нет
 +
|}
 +
 +
'''Что делать:''' В Red Hat для проверки длины паролей уже используется модуль '''pam_cracklib''', вызываемый из файла system-auth. Нам просто нужно заменить строку '''pam_cracklib''' следующей строкой:
 +
 +
<code>
 +
password requisite pam_passwdqc.so min=12,10,10,8,6
 +
retry=3
 +
</code>
 +
 +
Рис. 3 иллюстрирует параметры модуля '''pam_passwdqc'''. Качество пароля определяется его длиной, и в зависимости от количества типов символов, используемых в пароле, можно задать разные значения минимальной длину пароля. Существуют четыре типа символов: буквы нижнего и верхнего регистров, цифры и остальные символы. Заглавная буква в первом символе и цифра в последнем символе не в счет.
 +
 +
'''Как проверить:''' Попробуйте изменить свой пароль. Задавайте разные строки и в каждом случае подсчитывайте общее число символов и число типов символов, предполагая, что пароль должен быть приемлемым. Несколько примеров приведены во врезке «Допустим ли пароль?».
 +
 +
===== Запретим обычным пользователям выключать систему =====
 +
 +
Во многих системах обычным пользователям (не администраторам) дозволено выключать или перезагружать систему с помощью команд ''halt, shutdown и reboot'' — для рабочей машины предприятия, пожалуй, не лучшая идея. В данном эксперименте мы изменим конфигурацию PAM для этих команд, чтобы один лишь '''root''' мог выключать компьютер.
 +
 +
'''Что делать:''' Откройте файл настроек PAM для команды ''halt'' ('''/etc/pam.d/halt'''). В моем Red Hat стек '''auth''' для команды ''halt'' выглядит так:
 +
<code>
 +
  auth sufficient pam_rootok.so
 +
  auth required pam_console.so
 +
</code>
 +
Измените его следующим образом:
 +
<code>
 +
auth sufficient pam_rootok.so
 +
auth required pam_deny.so
 +
</code>
 +
 +
'''Как проверить:''' Зайдите в систему как обычный пользователь и попробуйте остановить систему командой ''halt''. У вас больше не должно этого получаться. Для полноты решения внесите те же изменения в файлы настроек для команд ''shutdown'' и ''reboot''.
 +
 +
''''Д-р Крис Браун''' — автор книги ''SUSE  Linux:  A  Complete  Guide to  Novell’s  Community  Distribution (Издательство «O’Reilly», 2006)''. Некоторые главы можно найти на странице http://www.oreilly.com/catalog/suselinux/. '''LXF'''
 +
 +
==== Часто используемые модули РАМ ====
 +
{| class="wikitable"
 +
|-
 +
! Модуль
 +
! Действие
 +
! Описание
 +
|-
 +
| pam_unix
 +
| auth, session, password
 +
| Выполняет аутентификацию в традиционном стиле Unix, используя хэши паролей, которые хранятся в '''/etc/shadow'''. Включен в файлы настроек PAM многих приложений, непосредственно или с помощью директивы '''include'''.
 +
|-
 +
| pam_limits
 +
| session
 +
| Устанавливает ограничения на системные ресурсы, отпускаемые на время пользовательского сеанса. По умолчанию эти ограничения берутся из файла '''/etc/security/limits.conf'''; здесь можно задать «жесткие» и «мягкие» границы для таких параметров, как максимальное число процессов, максимальный размер файла, процессорное время и т. д.)
 +
|-
 +
| pam_rootok
 +
| auth
 +
| Завершается успешно, если вы — администратор системы, и возвращает ошибку в противном случае. Обычно используется в сочетании с другими модулями аутентификации для реализации правила «Если вы администратор, можете продолжить и выполнить действие, если нет — необходима авторизация». Стек для этой политики может выглядеть так:
 +
<code>
 +
  auth sufficient pam_rootok.so
 +
  auth required pam_unix.so
 +
</code>
 +
|-
 +
| pam_cracklib
 +
| password
 +
| Проверяет качество пароля, затем еще раз проверяет пароль по системному словарю и ряду правил «плохого подбора пароля». Этот модуль обычно используется в стеке password, чтобы проверить качество пароля перед передачей его следующему модулю стека (обычно '''pam_unix'''), который обновляет пароль.
 +
|-
 +
| pam_passwdqc
 +
| password
 +
| Альтернативный модуль для проверки качества пароля, который поддерживает словосочетания (pass phrases) и может генерировать случайные пароли. Как и '''pam_cracklib''', этот модуль обычно используется в стеке '''password''' для проверки качества пароля перед его обновлением. Подробный пример приведен в '''эксперименте 5'''.
 +
|-
 +
| pam_permit
 +
| auth, account, session, password
 +
| Всегда говорит «да» и возвращает успешный результат выполнения.
 +
|-
 +
| pam_deny
 +
| auth, account, session, password
 +
| Всегда говорит «нет» и возвращает ошибку. Обычно он используется только в самом низу стека для гарантированного статуса «ошибка».
 +
|-
 +
| pam_warn
 +
| auth, account, session, password
 +
| Просто отправляет сообщение (включая имя сервиса, терминал, имя пользователя и удаленный хост) службе журнала '''syslogd'''. Может быть использован, например, ближе к нижней части стека PAM для записи в журнал информации о неудавшихся попытках аутентификации как раз перед тем, как модуль '''pam_deny''' отклонит их.
 +
|-
 +
| pam_motd
 +
| session
 +
| Выводит «приветствие дня» (по умолчанию это файл '''/etc/motd'''), обычно после успешного входа в систему.
 +
|-
 +
| pam_securetty
 +
| aurg
 +
| Нет, это не опечатка в слове «security». Модуль pam_securetty разрешает вход в систему от имени root только с «безопасных терминалов» («secure terminals»), перечисленных в файле '''/etc/securetty'''. (Запомните, tty на языке Linux означает «терминальное устройство»). Модуль никак не влияет на вход в систему для остальных пользователей. Этот способ управления доступом имел больше смысла в те дни, когда Unix работал на многопользовательских мини-компьютерах с 20 терминалами, включенными в порты RS-232; файл '''securetty''' мог использоваться для ограничения входа от имени '''root''' терминалом, запертым в офисе системного администратора. Однако он способен послужить и для полного запрета входа в систему под пользователем root… К этой идее мы еще вернемся в тексте.
 +
|-
 +
| pam_wheel
 +
| auth, account
 +
| Используется программами типа ''su''. Этот модуль разрешает администраторский доступ только пользователям, включенным в группу '''wheel'''. (Историческая справка: Использование названия «wheel» для группы привилегированных пользователей уходит корнями в давние времена. Оно точно было в ранних версиях Unix, и пришло, если верить файлу жаргона (http://www.catb.org/jargon/index.html, из ОС Twenex, распространенной в шестидесятых годах. Но я понятия не имею, почему ее называют «wheel».)
 +
|-
 +
| pam_winbind
 +
| auth
 +
| Аутентифицирует пользователей в соответствии с учетными данными домена Windows путем взаимодействия с демоном winbind (который, в свою очередь, взаимодействует с контроллером домена Windows). Это важный компонент для ситуаций, когда вы добавляете Linux в существующую инфраструктуру на базе Windows и хотите поддерживать между этими системами общую базу данных учетных записей пользователей.
 +
|-
 +
| pam_nologin
 +
| auth, account
 +
| Запрещает пользователям (кроме root) вход в систему, если существует файл '''/etc/nologin'''. В некоторых дистрибутивах этот файл создается программой ''shutdown'', чтобы запретить вход в систему во время ее остановки.
 +
|}

Текущая версия на 10:27, 17 ноября 2008

Содержание

[править] Эксперименты c PAM

Вы можете и не подозревать о существовании аутентификации, потому что она «просто работает». А вот как она работает? Д-р Крис Браун расскажет.

PAM (Pluggable Authentication Modules — подключаемые модули аутентификации) — один из тех темных закоулков Linux, куда большинство пользователей заглянуть не решается. Я даже готов побиться об заклад, что большинство пользователей не знают, что это такое. Однако PAM — в сердце каждой программы, так или иначе связанной с аутентификацией. Добро пожаловать на экскурсию по PAM! Заходите в нашу научную лабораторию, выполните наши экспе рименты (горелка Бунзена не потребуется!), и вы увидите, что PAM предоставляет тонкий контроль над политикой безопасности.

В LXF83 была статья Грэма Моррисона, в которой он провел обзор PAM и продемонстрировал ее гибкость, показав, как с ее помощью расширить аутентификацию пользователя в Linux, используя цифровой ключ, записанный на USB-брелок. В этом месяце мы пойдем дальше и рассмотрим более существенное повышение безопасности системы с помощью PAM. Те из вас, кто настриг LXF83 на мелкие кусочки и использовал их как подстилку в клетке своего хомячка, и те, кто просто не покупал этот номер, не переживайте: в первом разделе мы проведем небольшой обзор PAM, а в детали углубимся во втором.

[править] Часть 1: Знакомимся с PAM

Рис. 1. Архитектура PAM и взаимосвязь ее частей.

PAM — это каркас, помогающий приложениям выполнять то, что я называю «действиями, связанными с аутентификацией». PAM состоит из библиотеки (libpam) и набора модулей PAM, которые находятся в папке /lib/security и представляют собой динамически загружаемые библиотеки (.so). Каждый модуль служит для решения определенной задачи, и приложения, связанные с PAM, обычно используют стек из нескольких модулей. Общая архитектура показана на рис. 1. PAM определяет четыре типа действий, относящихся к аутентификации:

  • auth — наиболее очевидное действие: вы удостоверяете свою личность, предоставляя некоторый набор реквизитов. Обычно это имя пользователя и пароль, но возможны и другие варианты: например, физический ключ (как в LXF83), а то и биометрические методы, вроде отпечатков пальцев или сканирования сетчатки глаза.
  • account — действия, определяющие, можно ли вам зайти в систему (теперь, когда мы уже знаем, кто вы). К этой категории можно отнести, например, модуль PAM, ограничивающий вход пользователей в систему в зависимости от времени суток.
  • session — действия по выделению ресурсов, которые могут потребоваться пользователю во время сессии, например, монтирование домашнего каталога пользователя, установка лимитов на использование ресурсов системы, вывод ежедневного сообщения и т. д.
  • password — действия по обновлению реквизитов пользователя (обычно пароля).

Для краткости в дальнейшем я буду называть эти действия «задачами PAM».

[править] Какие программы используют PAM?

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

  • login — программа входа в текстовый терминал.
  • gdm — вход в графический рабочий стол.
  • su — запуск оболочки от имени нового пользователя.
  • passwd — задание нового пароля.

Рис. 2: Синтаксис файла конфигурации PAM.

Преимущество PAM в том, что «действия, связанные с аутентификацией», не привязаны к приложению, которое их использует. Благодаря этому гораздо проще менять политику безопасности или добавлять новые механизмы аутентификации: достаточно просто перенастроить PAM. Раньше для этого могло потребоваться изменение исходного кода самих приложений. Стек модулей, с помощью которых каждое приложение с аутентификацией через PAM выполняет одно из четырех соответствующих действий, определяется в файле конфигурации приложения, расположенном в каталоге /etc/pam.d. Имя файла соответствует имени приложения: например, файл /etc/pam.d/sshd содержит настройки PAM для программы sshd. На рис. 2 показана одна из строк такого файла. Эта строка добавляет к стеку auth модуль pam_unix.so. При необходимости приложение может сформировать все четыре стека (по одному для каждого из типов действий PAM), однако для большинства приложений достаточно двух.


Итак, основная идея такова: когда приложению надо выполнить одно из действий PAM, оно обращается к библиотеке PAM. Затем библиотека по очереди вызывает все модули в этом стеке. Каждый модуль «делает свое дело» и возвращает библиотеке положительный или отрицательный результат. Библиотека объединяет результаты модулей в результат для стека в целом, который возвращается приложению. Способ объединения определяется управляющим флажком модуля, прописанным во втором поле строки в файле настроек. Возможные значения флажка:

  • requisite Если модуль завершается с ошибкой, PAM немедленно возвращает приложению ошибку, другие модули стека не вызываются.
  • required Если модуль завершается с ошибкой, PAM возвращает ошибку приложению, но продолжает вызывать остальные модули стека. (Кто не в силах запомнить разницу между requisite и required, вступайте в спецклуб! Я уже в нем…)
  • sufficient Если модуль завершается успешно, PAM возвращает приложению результат «выполнен», и остальные модули стека не вызываются. (Конечно, предполагается, что никакой модуль с флажком required выше в стеке не отказал.)
  • optional Результат работы модуля (выполнен/ошибка) игнорируется. Обычно это означает, что модуль вызывается для выполнения некой операции, не имеющей отношения к принятию решения «пропустить/отказать» для всего стека. Например, модуль pam_keyinit — «необязательный» модуль для sshd, он создает новый «ключ сессии» для нового пользователя.


(Последние версии PAM поддерживают получение более подробного результата выполнения модуля, чем просто «выполнен/ошибка», и более сложный синтаксис для задания способа объединения отдельных результатов. Подробности можно найти на man-странице pam.conf, если она есть. Однако и этого простейшего отчета вполне достаточно.) В качестве управляющего флажка также может использоваться ключевое слово include. Эта ситуация немного отличается от других. Она предписывает PAM подключить некоторый предопределенный стек модулей (в терминах программирования это можно назвать вызовом подпрограммы). Это позволяет «вынести за скобку» наиболее общие действия PAM (например, общие стеки модулей), в отдельный файл. Например, в RHEL5 вы заметите, что во многих файлах конфигурации PAM подключен стек, определенный в файле system-auth. В Ubuntu 7.04 имеются четыре файла для аналогичной цели: common-auth, common-account, common-session и common-passwd. В Red Hat также есть своего рода «метамодуль» pam_stack, который выполняет стек модулей, определенных в отдельном файле.

Теперь, получив представление о том, как модули PAM связаны друг с другом, вы, возможно, захотите взглянуть на большую таблицу в конце этой статьи, где описаны модули, используемые чаще всего. Учтите, что некоторых модулей может не быть в вашем дистрибутиве, и, наоборот, вам могут попасться модули, которых нет в этой таблице. Поскольку Linux — открытая система и прочее, ребята понаписали всяких-разных модулей PAM. Некоторые ссылки можно найти на странице http://www.kernel.org/pub/linux/libs/pam/modules.html.

Ниже приведены шесть экспериментов с изменением настроек PAM. Ни один из них сам по себе особенно не впечатляет, но я надеюсь, что они придадут вам достаточно уверенности в себе и понимания работы PAM, чтобы начать свои собственные эксперименты.


[править] Часть 2: Экспериментируем с PAM

[править] Позволим всем пользователям переключаться в root без пароля через su.

Что делать: Замените все строки файла /etc/pam.d/su, относящиеся к стеку auth, единственной строкой:

auth sufficient pam_permit.so

Как проверить: Зайдите в систему как обычный пользователь и проверьте, что можете переключиться в root с помощью su без ввода пароля. Это может показаться рисковым, но все же менее опасно, чем разрешить пользователям сразу заходить в систему с привилегиями администратора. Например, вы можете зайти в систему как обычный пользователь, а затем выполнить команду

$ su -c "date 09201155"

чтобы установить системное время (действие, требующее привилегий администратора).

[править] Запретим всем пользователям использовать su

Что делать: Оставьте в файле /etc/pam.d/su только одну строку, относящуюся к стеку auth:

auth requisite pam_deny.so

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

[править] Разрешим su только пользователям из некоторой группы

Что делать: Для начала нам нужен хотя бы один пользователь в этой группе — назовем ее, например, wheel. Чтобы добавить пользователя chris в группу wheel, выполните следующую команду от имени администратора:

# usermod -G wheel chris

Теперь отредактируйте файл /etc/pam.d/su, чтобы стек auth выглядел следующим образом:

auth sufficient pam_rootok.so
auth required pam_wheel use_uid
auth include system-auth

Как проверить: Зайдите в систему как chris (или как любой другой пользователь из группы wheel) и попробуйте использовать su. Будет запрошен пароль администратора, после чего должен открыться сеанс администратора. Теперь попробуйте зайти в систему под другим пользователем — не членом группы wheel, и сделать то же самое. Снова будет запрошен пароль администратора, но переключиться в сеанс root не удастся. Можете попробовать изменить управляющий флажок для модуля pam_wheel в requisite — для этого измените строку в файле /etc/pam.d/su:

auth requisite pam_wheel use_uid

Вопрос на засыпку: какое произойдет изменение? Проверьте себя. Ну что, начали понимать, как настройки PAM формируют политику безопасности?

[править] Запретим вход в систему как root

Идея здесь в том, чтобы пользователи не могли войти в систему как администраторы: то есть зайти в систему придется как обычному пользователю, а затем переключиться в режим root с помощью su. (Предварительно убедитесь, что есть хотя бы один пользователь, имеющий на это право, не то вы заблокируете компьютер.) Нам нужно запретить вход как на виртуальные терминалы, так и на графический рабочий стол.

Что делать: Чтобы запретить вход на виртуальные терминалы, добавьте в файл /etc/pam/d/login строку

auth required pam_securetty.so

на верхушку стека auth (может быть, она уже есть там). Как мы уже видели, этот модуль запрещает вход в систему от имени root на терминалах, которых нет в списке /etc/securetty. Теперь мы можем очистить этот список с помощью пары команд:

# cp /etc/securetty /etc/securetty.saved
# echo "" > /etc/securetty

(Обратите внимание, что пустой файл /etc/securetty и отсутствие этого файла — совсем не одно и то же. В первом случае запрещается вход под root на все терминалы, а во втором, наоборот, разрешается.) Далее, чтобы запретить вход от имени root в графический рабочий стол, добавьте ту же самую строку в стек auth в файле /etc/pam.d/gdm.

Как проверить: Попытайтесь зайти в систему как root (с правильным паролем) — и через виртуальный терминал, и через графический рабочий стол. Обе попытки должны потерпеть неудачу. Убедитесь, что вы можете зайти в систему как обычный пользователь. Обратите внимание, что если прибавить к этому Эксперимент 3, безопасность системы существенно повысится, потому что для получения доступа администратора придется сначала зайти в систему как пользователь из группы wheel, а затем открыть сеанс администратора через su. Даже пронюхав пароль администратора, взломщик не получит его привилегий.

[править] Используем сложные пароли

В этом эксперименте мы используем модуль pam_passwdqc стека password, чтобы заставить пользователей назначать сложные пароли. (Это сработает только в том случае, когда пользователь задает или изменяет свой пароль, и не позволит выявить «слабости» уже действующих паролей.)

Рис. 3: Параметры модуля pam_passwdqc.

Приемлем ли пароль?

Пароль Длина Tипов символов ОК?
monpiastoria 12 1 Да
LinuxFormat 11 2 Да
beld*Grob 9 3 Да
4Me+You 7 4 Да
splodgerat 10 1 Нет
Four+five 9 2 Нет †
gosH!!2 7 3 Нет *
x4Z! 4 4 Нет

Что делать: В Red Hat для проверки длины паролей уже используется модуль pam_cracklib, вызываемый из файла system-auth. Нам просто нужно заменить строку pam_cracklib следующей строкой:

password requisite pam_passwdqc.so min=12,10,10,8,6
retry=3

Рис. 3 иллюстрирует параметры модуля pam_passwdqc. Качество пароля определяется его длиной, и в зависимости от количества типов символов, используемых в пароле, можно задать разные значения минимальной длину пароля. Существуют четыре типа символов: буквы нижнего и верхнего регистров, цифры и остальные символы. Заглавная буква в первом символе и цифра в последнем символе не в счет.

Как проверить: Попробуйте изменить свой пароль. Задавайте разные строки и в каждом случае подсчитывайте общее число символов и число типов символов, предполагая, что пароль должен быть приемлемым. Несколько примеров приведены во врезке «Допустим ли пароль?».

[править] Запретим обычным пользователям выключать систему

Во многих системах обычным пользователям (не администраторам) дозволено выключать или перезагружать систему с помощью команд halt, shutdown и reboot — для рабочей машины предприятия, пожалуй, не лучшая идея. В данном эксперименте мы изменим конфигурацию PAM для этих команд, чтобы один лишь root мог выключать компьютер.

Что делать: Откройте файл настроек PAM для команды halt (/etc/pam.d/halt). В моем Red Hat стек auth для команды halt выглядит так:

 auth sufficient pam_rootok.so
 auth required pam_console.so

Измените его следующим образом:

auth sufficient pam_rootok.so
auth required pam_deny.so

Как проверить: Зайдите в систему как обычный пользователь и попробуйте остановить систему командой halt. У вас больше не должно этого получаться. Для полноты решения внесите те же изменения в файлы настроек для команд shutdown и reboot.

'Д-р Крис Браун — автор книги SUSE  Linux:  A  Complete  Guide to  Novell’s  Community  Distribution (Издательство «O’Reilly», 2006). Некоторые главы можно найти на странице http://www.oreilly.com/catalog/suselinux/. LXF

[править] Часто используемые модули РАМ

Модуль Действие Описание
pam_unix auth, session, password Выполняет аутентификацию в традиционном стиле Unix, используя хэши паролей, которые хранятся в /etc/shadow. Включен в файлы настроек PAM многих приложений, непосредственно или с помощью директивы include.
pam_limits session Устанавливает ограничения на системные ресурсы, отпускаемые на время пользовательского сеанса. По умолчанию эти ограничения берутся из файла /etc/security/limits.conf; здесь можно задать «жесткие» и «мягкие» границы для таких параметров, как максимальное число процессов, максимальный размер файла, процессорное время и т. д.)
pam_rootok auth Завершается успешно, если вы — администратор системы, и возвращает ошибку в противном случае. Обычно используется в сочетании с другими модулями аутентификации для реализации правила «Если вы администратор, можете продолжить и выполнить действие, если нет — необходима авторизация». Стек для этой политики может выглядеть так:

 auth sufficient pam_rootok.so
 auth required pam_unix.so

pam_cracklib password Проверяет качество пароля, затем еще раз проверяет пароль по системному словарю и ряду правил «плохого подбора пароля». Этот модуль обычно используется в стеке password, чтобы проверить качество пароля перед передачей его следующему модулю стека (обычно pam_unix), который обновляет пароль.
pam_passwdqc password Альтернативный модуль для проверки качества пароля, который поддерживает словосочетания (pass phrases) и может генерировать случайные пароли. Как и pam_cracklib, этот модуль обычно используется в стеке password для проверки качества пароля перед его обновлением. Подробный пример приведен в эксперименте 5.
pam_permit auth, account, session, password Всегда говорит «да» и возвращает успешный результат выполнения.
pam_deny auth, account, session, password Всегда говорит «нет» и возвращает ошибку. Обычно он используется только в самом низу стека для гарантированного статуса «ошибка».
pam_warn auth, account, session, password Просто отправляет сообщение (включая имя сервиса, терминал, имя пользователя и удаленный хост) службе журнала syslogd. Может быть использован, например, ближе к нижней части стека PAM для записи в журнал информации о неудавшихся попытках аутентификации как раз перед тем, как модуль pam_deny отклонит их.
pam_motd session Выводит «приветствие дня» (по умолчанию это файл /etc/motd), обычно после успешного входа в систему.
pam_securetty aurg Нет, это не опечатка в слове «security». Модуль pam_securetty разрешает вход в систему от имени root только с «безопасных терминалов» («secure terminals»), перечисленных в файле /etc/securetty. (Запомните, tty на языке Linux означает «терминальное устройство»). Модуль никак не влияет на вход в систему для остальных пользователей. Этот способ управления доступом имел больше смысла в те дни, когда Unix работал на многопользовательских мини-компьютерах с 20 терминалами, включенными в порты RS-232; файл securetty мог использоваться для ограничения входа от имени root терминалом, запертым в офисе системного администратора. Однако он способен послужить и для полного запрета входа в систему под пользователем root… К этой идее мы еще вернемся в тексте.
pam_wheel auth, account Используется программами типа su. Этот модуль разрешает администраторский доступ только пользователям, включенным в группу wheel. (Историческая справка: Использование названия «wheel» для группы привилегированных пользователей уходит корнями в давние времена. Оно точно было в ранних версиях Unix, и пришло, если верить файлу жаргона (http://www.catb.org/jargon/index.html, из ОС Twenex, распространенной в шестидесятых годах. Но я понятия не имею, почему ее называют «wheel».)
pam_winbind auth Аутентифицирует пользователей в соответствии с учетными данными домена Windows путем взаимодействия с демоном winbind (который, в свою очередь, взаимодействует с контроллером домена Windows). Это важный компонент для ситуаций, когда вы добавляете Linux в существующую инфраструктуру на базе Windows и хотите поддерживать между этими системами общую базу данных учетных записей пользователей.
pam_nologin auth, account Запрещает пользователям (кроме root) вход в систему, если существует файл /etc/nologin. В некоторых дистрибутивах этот файл создается программой shutdown, чтобы запретить вход в систему во время ее остановки.
Персональные инструменты
купить
подписаться
Яндекс.Метрика