Что такое код accessresource


Содержание

HTTP протокол: основные правила Интернета, которые должен знать каждый веб-разработчик. Как браузер взаимодействует с сервером.

HTTP коды ошибок клиента

Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике Серверы и протоколы и ее разделе HTTP протокол. Эта запись целиком и полностью посвящена ошибка клиента при взаимодействие по HTTP протоколу. Мы с тобой рассмотрим коды ошибок клиента HTTP. Вообще, коды ошибок клиента в HTTP протоколе могут быть расширены любым сервером, мы рассмотрим только коды ошибок клиента, которые указаны в стандарте HTTP 1.1. Сперва, как и обычно при рассмотрение кодов HTTP протокола, мы дадим общее описания кодам ошибок клиента, а затем рассмотрим по отдельности каждый из 18 HTTP кодов ошибок клиента.

HTTP коды ошибок клиента

Общая информация о HTTP кодах ошибок клиента

HTTP коды ошибок клиента говорят пользователю о том, что ему не удалось получить запрашиваемый ресурс, указанный в URI (запись про URI в HTTP), по вине самого пользователя или клиента, например, пользователь ошибся при вводе URL в браузере, в этом случае сервер даст ответ с кодом состояния 404. Все коды ошибок HTTP клиента начинаются с четверки. HTTP сервер всегда в случае ошибки клиента отправляет вместе с кодом состояния пояснения того, почему произошла ошибка, за исключение тех случаев, когда используется HTTP метод HEAD.

Давайте для удобства рассмотрения сведем в одну таблицу все коды ошибок HTTP клиента в одну таблицу. И не будем забывать, что в основе протокола HTTP лежит модель взаимодействия клиент-сервер, которая делит обязанности приложений на клиентские и серверные, рассматриваемый протокол довольно строго придерживается данной модели, и у нас есть специальные коды ошибок, которые происходят по вине серверных приложений и есть коды ошибок, которые происходят по вине человека или клиентского приложения, которым человек пользуется.

Код ошибки HTTP клиента Описание кода ошибки HTTP клиента
400 Bad Request Код состояния ошибки HTTP клиента 400: плохой запрос

Такой код состояния ошибки клиента вы можете увидеть тогда, когда сервер не понял ваш запрос из-за синтаксической ошибке в HTTP запросе.

401 Unauthorized Код состояния ошибки HTTP клиента 401: не авторизован

Такой код состояния ошибки клиента вы можете увидеть в том случае, если для доступа к ресурсу требуется аутентификация по соображениям безопасности HTTP сервера.

402 Payment Required Код состояния ошибки HTTP клиента 402: требуется оплата

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

403 Forbidden Код состояния ошибки HTTP клиента 403: запрещено

Такой код состояния ошибки клиента вы увидите в том случае, когда сервер вас прекрасно понял, но отказывается вам предоставлять доступ к ресурсу из-за того, что у вас недостаточно прав доступа.

404 Not Found Код состояния ошибки HTTP клиента 404: не найдено

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

405 Method Not Allowed Код состояния ошибки HTTP клиента 405: метод не дозволен

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

406 Not Acceptable Код состояния ошибки HTTP клиента 406: не приемлем

Этот код состояния вы увидите в том случае, когда HTTP сообщение вашего клиента содержит неправильные параметры для указанного в нем URI.

407 Proxy Authentication Required Код состояния ошибки HTTP клиента 407: требуется установления подлинности через прокси-сервер

Если вы видите этот код состояния ошибки клиента, то вам нужно пройти аутентификацию на прокси-сервере.

408 Request Timeout Код состояния ошибки HTTP клиента 408: истекло время ожидания запроса

Этот код состояния ошибки HTTP клиента вы увидите тогда, когда сервер устал ждать от вас сообщение.

409 Conflict Код состояния ошибки HTTP клиента 409: конфликт

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

410 Gone Код состояния ошибки HTTP клиента 410: удален

А этот код состояния ошибки клиента будет показан сервером в том случае, когда ресурс был доступен по указанному URI, но теперь его там нет.

411 Length Required Код состояния ошибки HTTP клиента 411: требуется длина

Этот код состояния ошибки клиента появляется в том случае, когда серверу нужно обязательно указывать поле заголовка Content-Lenght

412 Precondition Failed Код состояния ошибки HTTP клиента 412: предусловие неверно

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

413 Request Entity Too Large Код состояния ошибки HTTP клиента 413: объект запроса слишком велик

А такой код ошибки клиента можно увидеть в том случае, когда тело (HTTP объекты и тело сообщения) запроса слишком большое и сервер его получить не смог.

414 Request-url Too Long Код состояния ошибки HTTP клиента 414: URI запроса слишком длинный

Такой код ошибки клиента сервер выдаст в том случае, если URI запроса слишком длинный.

415 Unsupported Media Type Код состояния ошибки HTTP клиента 415: неподдерживаемый медиа тип

Сервер может выдать такой код состояния ошибки клиента в том случае, если не захочет работать с указанным типом данных (типы данных в HTTP) тем методом, который указан в запросе клиента

416 Requested Range Not Satisfiable Код состояния ошибки HTTP клиента 416: запрашиваемый диапазон не достижим

Данный код и ошибки клиента говорит нам о том, что диапазон фрагмента (единицы измерения в HTTP) в поле заголовка Range указан неверно.

417 Expectation Failed Код состояния ошибки HTTP клиента 417: ожидаемое неприемлимо

Код состояния ошибки клиента 417 появится в том случае, если сервер не сможет удовлетворить значению, указанному в поле заголовка Expect.

Далее мы рассмотрим более подробно коды ошибок HTTP клиента.

HTTP код ошибки 400, код ошибки 401, код ошибки клиента 402, код ошибки 403, HTTP код ошибки клиента 404, ошибка клиента 405

HTTP код ошибки клиента 400: Bad Request или неверный запрос. Сервер вернет ответ с кодом ошибки 400 в том случае, когда обнаружит, что HTTP запрос клиента содержит синтаксическую ошибку.

HTTP код ошибки клиента 401: Unauthorized или не авторизован. Код ошибки клиента 401 сервер отправляет в том случае, когда для доступа к ресурсу требуется авторизация, при этом ответ HTTP сервера должен (читай про требования HTTP протокола) включать поле заголовка WWW-Authenticate и перечень условий для аутентификации клиента, после чего клиент может повторить запрос к серверу с полем Authorization, в котором будут указаны все необходимые данные для авторизации.

HTTP код ошибки клиента 402: Payment Required или требуется оплата. Данный код ошибки клиента зарезервирован для будущего использования и предназначен для оповещения клиента о том, что для доступа к ресурсу ему необходимо произвести оплату. Обратите внимание: данный код ошибки клиент не используется ни хостингами, ни интернет-магазина, ни даже интернет-провайдерами.

HTTP код ошибки клиента 403: Forbidden или запрещено. HTTP код ошибки клиента 403 отправляется сервером в том случае, когда он отказывается выполнить ваш запрос, причин на то могут быть разными. При этом сервер не должен сообщать является ли эта мера временной или постоянной. Одной из причин появления HTTP кода 403 может быть то, что у пользователя недостаточно прав доступа к ресурсу.

HTTP код ошибки клиента 404: Not Found или не найдено. HTTP код ошибки клиента 404 – самый популярный код ошибки клиента, код ошибки 404 видел, наверное, каждый. Ведь для того, чтобы увидеть код ошибки 404 достаточно ввести неверный URL.

HTTP код ошибки клиента 405: Method Not Allowed или метод не дозволен. Код ошибки 405 сервер отправляет клиенту в том случае, когда для ресурса, указанного в URI, нельзя применить метод, указанный в запросе клиента. Код ошибки 405 появляется в основном из-за конфигураций безопасности сервера, когда администратор преднамеренно запрещает выполнение тех или иных методов HTTP запросов на сервере. При этом ответ сервера с кодом ошибки 405 должен содержать поле заголовка Allow, в котором будут указаны доступные метода для ресурса.

HTTP код ошибки 406, код ошибки 407, HTTP код ошибки клиента 408, код ответа сервера 409, код ошибки 410, код ошибки клиента 411, HTTP код 412

HTTP код ошибки клиента 406: Not Acceptable или не приемлем. Код ошибки 406 говорит клиенту о том, что введенный URI не приемлем с теми характеристиками, которые были указаны в HTTP заголовке (читай про параметры HTTP протокола). Если метод запроса был отличным от метода HEAD, то серверу нужно включить в тело сообщения список доступных характеристик для данного URI. Формат HTTP объекта определяется медиа типом в поле заголовка Content-Length и в зависимости от клиента и его возможностей подходящий вариант запроса может быть выбран автоматически, этот код применяется при обсуждении содержимого в HTTP.

HTTP код ошибки клиента 407: Proxy Authentication Required или требуется установление подлинности через прокси-сервер. HTTP код ошибки клиента 407 появится в том случае, когда клиенту для доступа к указанному ресурсу необходимо авторизоваться на прокси-сервере. Когда возникает код ошибки 407 прокси-сервер должен возвратить поле заголовка Proxy-Authenticate содержащее вызов (challenge), применяемый прокси-сервером для запрошенного ресурса. Код ошибки 407 аналогичен по своему действию с кодом 401.

HTTP код ошибки клиента 408: Request Timeout или истекло время ожидания запроса. Код ошибки 408 возникает в том случае, когда клиент не произвел запрос в течение того времени, которое сервер готов ждать, но клиент может повторить запрос.

HTTP код ошибки клиента 409: Conflict или конфликт. Код ошибки клиента 409 возникает в том случае, когда происходит конфликт между несколькими клиентами при доступе к одному ресурсу. Код ошибки 409 показывается клиенту только в том случае, когда тот может устранить конфликт и повторить свой запрос. HTTP ответ сервера должен предоставить максимум информации для пользователя, чтобы он устранил конфликт, и код 409 больше не появлялся. Чаще всего ошибка 409 появляется при использование метода PUT.

HTTP код ошибки клиента 410: Gone или удален. HTTP код ошибки клиента 410 будет отправлен сервером в том случае, когда ресурс удален и сервер не знает, где искать копию ресурса или его новую версию. В том случае, когда у сервера есть информация о том, что ресурс может быть восстановлен, ему не следует показывать ошибку 410, а лучше показать код ошибки 404.

HTTP код ошибки клиента 411: Length Required или требуется длина. Код ошибки 411 будет показан клиенту в том случае, когда серверу для корректной обработки запроса требуется длина содержимого. Клиент может повторить запрос, если добавит допустимое поле заголовка Content-Length, содержащее длину тела сообщения (message-body) в сообщении запроса.

HTTP код ошибки клиента 412: Precondition Failed или предусловие неверно. Код ошибки 412 будет выслан клиенту сервером в том случае, когда сервер не может выполнить условия, указанные в заголовке HTTP запроса.

HTTP код ошибки клиента 413, код ошибки клиента 414, ошибка клиента 415, ошибка 416, HTTP код 417

HTTP код ошибки клиента 413: Request Entity Too Large или объект запроса слишком большой. Код ошибки 413 появляется в том случае, когда объект, передаваемый в запросе клиента слишком большой и сервер его не может обработать. Сервер может закрыть соединение (здесь написано про HTTP соединения), чтобы не дать клиенту возможность продолжить запрос. Если такая ситуация временная, то сервер в своем сообщении вместе кодом ошибки 413 передает поле заголовка Retry-After, в котором указывает время, через которое запрос может быть повторен.

HTTP код ошибки клиента 414: Request-URI Too Long или запроса слишком длинный. Сервер отправляет сообщение с кодом ошибки 414 в том случае, когда URI, указанный в запросе слишком длинный. Ошибка 414 обычно возникает тогда, когда клиент пытается передать кучу параметров методом GET, а следовало бы использовать метод POST.

HTTP код ошибки клиента 415: Unsupported Media Type или неподдерживаемый медиа тип. Код ошибки 415 сервер отправляет в том случае, когда он отказывается обслуживать запрос из-за некорректного типа данных для ресурса, который указан в URI: когда метод выбранный в запросе не соответствует типу данных ресурса.

HTTP код ошибки клиента 416: Requested Range Not Satisfiable или запрашиваемый диапазон не достижим. Сервер отправит сообщение с кодом ошибки 416 в том случае, когда в поле заголовка запроса Range был указан неверный диапазон фрагмента.

HTTP код ошибки клиента 417: Expectation Failed или ожидаемое неприемлемо. Код ошибки 417 появляется в том случае, когда сервер не может удовлетворить значению Expect, которое указано в заголовке HTTP запроса.

Мы рассмотрели коды ошибок HTTP клиента, давайте перейдем к последнему классу кодов состояния — HTTP коды ошибок серевра. Позволю себе напомнить, что в HTTP еще есть информационные коды состояния, успешные коды состояния и коды перенаправления. А если тебе нужна информацию обо всех кодах состояния, обратись к справочнику HTTP кодов состояния, в котором есть полное описание всех кодов.

Что такое CORS?

Все ответы из серии лучше бы молчал. Смысл повторять то, что написано в википедии. Вам в вопросе человек явно указал — НА ПАЛЬЦАХ, а они ему про стандарты. Дали бы просто ссылку на MDN — там самая лучшая документация обо всём: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
На русском тоже есть статьи: https://grishaev.me/cors

Вот моя текущая проблема, объсняю на её примере:

На нашем сервере (Сервер А) размещается Ангуляр приложение (DAPP), представляющее собой интерфейс к Ethernet смарт-контракту, который грубо говоря является нашим бэкендом.

На стороннем сервисе (Сервер Б) запущен http-интерфейс для доступа к нашему контракту (фактически это шлюз в сеть Ethereum). Это бесплатный сервис, к которому у нас нет доступа (Infura).

Мне нужно из моего DAPP, запущенного в браузере пользователя и которое загрузилось с Сервера А, делать http-запросы на Сервер Б, и тут в браузере выскакивает CORS и кричит НИИИИЗЯЯЯЯЯЯЯЯ! Причём в Chrome всё ок, а в долбаном тормозном Firefox (господи, сократи число пользующиегося им идиотов, чтобы он скорее издох) вылетает ошибка. Ибо, как завещает CORS, негоже JS коду, загруженному с одного адреса, делать http запросы на другой. Причём CORS устроен так, что эта ошибка не дебажится с помощью JS — типа для того чтобы это ограничение не смогли никак обойти. Поэтому какие бы я не прописывал Серверу А заголовки ‘Allow-Origin’, это ничего не меняет. В Гугле уже осознали весь идиотизм ситуации и в новых версиях Хрома уже не блочат всё подряд, как раньше, пропуская “простые” запросы (GET/POST), остальный браузеры пока тупят.

ПС. Проблему решили запуском прокси сервера, который добавляет в ответы от Сервера 2 заголовки Access-Controll-Allow-Origin с адресом Сервера 1. Тоесть Сервер 2 должен сказать браузеру, что он доверяет коду, загруженному с Сервера 1. Вот и весь CORS.

Cross-Origin. это значит «между хостами». То есть вы делаете запросы с «localhost:3000» на «localhost:8080» или с «example.com» на «google.com», или с «example.com» на «api.example.com».

Resource — тобишь ресурсы. Можете почитать что это такое в контексте REST или HTTP или URI.

Sharing — ну тут я думаю тоже должно быть понятно. «обмен». То есть это правила которые определяют «можно ли чуваку получить доступ к этому ресурсу».

Нужна эта штука для того что бы говорить «разрешает ли сервак запросы с этого орижина на этот ресурс».

Часть 3. Передача кода авторизации

Серия контента:

Этот контент является частью # из серии # статей: Использование клиентов OAuth 2.0 в Java-программировании

Этот контент является частью серии: Использование клиентов OAuth 2.0 в Java-программировании

Следите за выходом новых статей этой серии.

Обзор

OAuth – это открытый стандарт авторизации, позволяющий клиентам получать доступ к защищенным ресурсам сервера от имени владельца ресурса. Владельцем ресурса может быть другой клиент или конечный пользователь. OAuth также помогает конечным пользователям разрешать третьим лицам доступ к своим ресурсам на сервере без необходимости передавать собственные регистрационные данные, такие как имя пользователя и пароль. Эта серия статей посвящена системе авторизации OAuth 2.0, описанной в документе RFC RFC6749. Полная система авторизации OAuth 2.0, описанная в RFC 6749, находится на веб-сайте Internet Engineering Task Force (см. раздел Ресурсы).

Грант авторизации

Грант авторизации – это реквизит доступа, служащий разрешением владельца ресурса на авторизацию, который можно использовать для доступа к защищенному ресурсу. Этот реквизит используется клиентом для получения ключа доступа, а ключ доступа в конечном итоге передается вместе с запросом доступа к защищенному ресурсу. В OAuth 2.0 определены гранты четырех типов:

  1. Код авторизации
  2. Неявный
  3. Реквизиты доступа владельца ресурса
  4. Реквизиты клиента

В этой серии статей мы разберем способы реализации клиента OAuth 2.0 на языке программировании Java™ с использованием каждого из перечисленных выше типов грантов. В настоящей, третьей части я объясню, как реализовать грант кода авторизации. В этой статье приводится подробное описание гранта и рассматривается пример клиентского кода, который можно использовать для связи с любым OAuth 2.0-совместимым сервером, поддерживающим этот грант. После прочтения статьи читатель должен иметь полное представление о реализации клиента и быть готовым к загрузке примера клиентского кода для самостоятельного тестирования.

Грант кода авторизации

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

Грант кода авторизации иллюстрируется на рисунке 1.

Рисунок 1. Блок-схема передачи кода авторизации

Схема, приведенная на рисунке 1, демонстрирует следующие действия:

  • (A) Клиент (обычно веб-приложение) инициирует процесс, направляя агент пользователя владельца ресурса (обычно веб-браузер) в конечную точку авторизации. Запрос клиента содержит идентификатор клиента, область действия запроса, локальное состояние и URI переадресации. После предоставления доступа (или отказа) сервер авторизации возвращает агент пользователя (обычно веб-браузер) по URI переадресации.
  • (B) Владелец ресурса проходит проверку подлинности на сервере авторизации посредством агента пользователя и предоставляет клиенту доступ или отклоняет запрос.
  • (C) Если владелец ресурса предоставляет доступ, то сервер авторизации перенаправляет агент пользователя (обычно веб-браузер) назад к клиенту, используя предоставленный ранее (в запросе или при регистрации клиента) URI переадресации. URI переадресации включает в себя код авторизации и любые сведения о локальном состоянии, предоставленное клиентом.
  • (D) Клиент делает запрос ключа доступа из конечной точки выдачи ключей сервера авторизации, передавая код авторизации, полученный на предыдущем шаге. Делая запрос, клиент проходит проверку подлинности на сервере авторизации, используя реквизиты клиента. Клиент также включает в запрос используемый URI переадресации, чтобы получить код авторизации для проверки.
  • (E) Сервер авторизации выполняет проверку подлинности клиента. Он проверяет код авторизации и гарантирует, что полученный URI переадресации соответствует тому, что использовался для переадресации клиента на шаге (C). Если проверка проходит успешно, то сервер авторизации выдает ключ доступа и, при необходимости, ключ обновления – если запрашивается доступ в автономном режиме.

Запрос кода авторизации

Запрос кода авторизации соответствует шагам (А) и (B), см. Рисунок 1. На шаге (A) клиент делает запрос к серверу авторизации в формате application/x-www-form-urlencoded , как показано в листинге 1.

Листинг 1. Пример запроса кода авторизации

Запрос должен содержать следующие параметры:

  • response_type : обязательный. Должен иметь значение code .
  • client_id : обязательный. Идентификатор клиента.
  • redirect_uri : обязательный. Используется для переадресации агента пользователя.
  • scope : факультативный. Область запроса доступа.
  • state : факультативный. Для сохранения состояния между запросом и обратным вызовом.

После проверки запроса сервером авторизации тот возвращает клиенту ответ с кодом переадресации HTTP 302. Ответ также содержит URI переадресации в заголовке http Location . На шаге (B) клиент должен переадресовать агент пользователя (обычно веб-браузер) по этому URI. Этот URI переадресации обычно указывает на страницу входа, где владелец ресурса может войти со своими полномочиями и предоставить доступ по запросу клиента или отказать в нем.

Ответный код авторизации

Ответный код авторизации показан на шаге (C) рисунка 1. Если владелец ресурса посылает запрос доступа, то сервер авторизации выдает код авторизации. Сервер авторизации перенаправляет агент пользователя по URI переадресации, переданный в рамках запроса на шаге (A), и включает код авторизации в запрос URI переадресации в формате application/x-www-form-urlencoded .

URI имеет следующие параметры:

  • Code : обязательный. Код авторизации, созданный сервером авторизации. Этот код носит временный характер, и его срок быстро истекает. Клиент не должен использовать код авторизации более одного раза. Любые дальнейшие запросы с использованием этого кода должны отклоняться сервером авторизации. Код авторизации связан с идентификатором клиента и URI переадресации.
  • State : обязательный. Если в запросе кода авторизации клиента присутствовал параметр state , то этот параметр должен иметь точное значение, полученное от клиента.

Запрос ключа доступа

Этот запрос соответствует шагу (D) на рисунке 1. Клиент делает запрос к конечной точке (сервер авторизации) в формате application/x-www-form-urlencoded , как показано в листинге 2.

Листинг 2. Пример запроса ключа доступа

Запрос ключа доступа должен иметь следующие параметры:

  • grant_type : обязательный. Должен иметь значение authorization_code .
  • client_id : обязательный. Идентификатор клиента.
  • client_secret : факультативный. Секретный ключ. Для проверки подлинности на сервере авторизации.
  • code : обязательный. Код авторизации, полученный от сервера.
  • redirect_uri : обязательный. Тот же, что и на шаге (A).

Сервер авторизации проверяет правильность кода и URI переадресации. В случае конфиденциальных клиентов сервер авторизации также проверяет подлинность клиента с использованием реквизитов клиента, передаваемых в теле запроса или в заголовке авторизации.

Ответ на запрос ключа доступа

Этот ответ соответствует шагу (Е) на рисунке 1. Если запрос ключа доступа действителен и авторизован, то сервер авторизации возвращает ключ доступа в ответе на запрос ключа доступа. Пример успешного ответа показан в листинге 3.

Листинг 3. Пример успешного ответа на запрос ключа доступа.

Если запрос недействителен или не авторизован, то сервер авторизации возвращает код с соответствующим сообщением об ошибке.

Запрос ключа обновления

Это необязательный шаг, который используется, если клиент запросил доступ в автономном режиме и включил в запрос ключа доступа параметр refresh_token . Ключ доступа – это временный ключ, срок действия которого обычно истекает через час. По истечении срока действия ключа доступа клиент должен повторить процесс проверки подлинности, а владелец ресурса – войти в систему и снова предоставить клиенту разрешение на запрос ключа доступа.

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

Клиент делает запрос к конечной точке (сервер авторизации) в формате application/x-www-form-urlencoded , как показано в листинге 4.

Листинг 4. Запрос к конечной точке

Параметры запроса определяются следующим образом:

  • grant_type : обязательный. Должен иметь значение refresh_token .
  • refresh_token : обязательный. Извлекается ранее из запроса ключа доступа.
  • scope : факультативный. Область запроса доступа.

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

Ответ на запрос ключа обновления

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

Листинг 5. Ответ на запрос ключа обновления

Если запрос недействителен или не авторизован, то сервер авторизации возвращает код с соответствующим сообщением об ошибке.

Установка

Пример клиента Outh2.0 представляет собой динамический веб-проект. Файл .war проекта и исходный код можно загрузить по ссылке в разделе Загрузки. Импортируйте файл .war в среду Eclipse.

Предварительные замечания

Чтобы настроить среду разработки и импортировать прилагаемый проект, нужно загрузить IDE Eclipse для разработчиков Java EE. Eclipse можно загрузить со страницы загрузки Eclipse.

Для запуска веб-клиента OAuth 2.0 нужен контейнер Apache Tomcat JSP/Servlet. Tomcat можно загрузить со страницы загрузки Apache Tomcat.

Зависимости

Проект кода клиента зависит от следующих JAR-файлов:

  1. commons-codec-1.6.jar
  2. commons-logging-1.1.1.jar
  3. httpclient-4.2.5.jar
  4. httpclient-cache-4.2.5.jar
  5. httpcore-4.2.4.jar
  6. httpmime-4.2.5.jar
  7. json-simple-1.1.1.jar

JAR-файлы, упомянутые в пунктах 1-6, находятся в файле JAR HttpComponents , который можно загрузить со страницы загрузок HttpComponents. Файл json-simple-1.1.1.jar можно загрузить из проекта JSON Simple. Скопируйте эти jar-файлы в папку lib каталога установки Apache Tomcat. Некоторые из необходимых файлов JAR, возможно, уже присутствуют в Tomcat по умолчанию, так что нужно скопировать только недостающие.

Импорт файла .war проекта в Eclipse

После установки Eclipse и Apache Tomcat нужно импортировать файл .war из раздела Загрузки. Для этого выполните следующие простые инструкции, приведенные на веб-сайте Eclipse в разделе Импорт файлов веб архива (WAR).

Во время импорта файла .war в Eclipse должна поддерживаться связь сервера Tomcat с вашим проектом. Для завершения настройки нужно выбрать версию Tomcat и указать путь к корневой папке установки Tomcat.

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

После успешного импорта файла .war в рабочее пространство Eclipse вы найдете исходный код в папке Java Resources/srcc в иерархии проекта.

Запуск клиента OAuth 2.0

Когда файл успешно импортирован .war и Tomcat настроен с необходимыми JAR-файлами, можно запустить клиент, щелкнув правой кнопкой мыши на имени проекта OAuth2.0_AuthCode и выбрав Run As и Run on Server.

Это приведет к развертыванию клиента на сервере и загрузке страницы index.html во внутренний браузер Eclipse. Лично я предпочитаю работать с веб-клиентом во внешнем браузере.

Веб-клиент доступен для любого браузера по адресу: http://localhost:8080/OAuth2.0_AuthCode .

В последующих разделах приводится детальный разбор кода клиента и показано, как проверить этот клиент с популярными OAuth 2.0-совместимыми серверами, такими как Salesforce, Google и IBM.

Код клиента OAuth 2.0

Пример клиента OAuth 2.0, содержащийся в этой статье, реализует грант кода авторизации. Это не обычный проект Java, как в случае грантов, обсуждаемых в предыдущих статьях, а веб-приложение. Это вызвано тем, что грант кода авторизации предназначен для обслуживания веб-приложений и оптимизирован для агента пользователя, который обычно представляет собой веб-браузер.

Входные параметры

Входные параметры клиента передаются посредством файла параметров Oauth2Client.config, который находится в папке src проекта. Это следующие входные параметры:

  • scope : необязательный параметр. Определяет область запроса доступа. Ключ доступа, возвращенный сервером, обеспечивает доступ только к тем службам, которые входят в эту область.
  • state : необязательный параметр. Используется для сохранения состояния между клиентским запросом и ответом переадресации от сервера авторизации, чтобы обеспечить целостность клиента.
  • grant_type : должен иметь значение authorization_code , что соответствует гранту кода авторизации.
  • client_id : идентификатор клиента или потребителя, предоставляемый сервером ресурсов при регистрации приложения.
  • client_secret : секретный ключ клиента или потребителя, предоставляемый сервером ресурсов при регистрации приложения.
  • access_token : ключ доступа, возвращенный сервером авторизации в ответ на действительный и авторизованный запрос ключа доступа. Код авторизации, возвращенный сервером авторизации, обменивается на ключ доступа.
  • refresh_token : ключ обновления, возвращенный сервером авторизации в ответ на действительный и авторизованный запрос ключа доступа. Ключ обновления можно использовать для обновления ключа доступа с истекшим сроком действия без необходимости присутствия владельца ресурса для повторной проверки подлинности. Клиент должен явным образом запросить ключ обновления у сервера.
  • redirect_uri : URI, на который сервер авторизации будет перенаправлять агент пользователя при запросе кода авторизации. Код авторизации направляется на этот URI.
  • authentication_server_url : это сервер авторизации. Все запросы кода авторизации необходимо направлять в этот URL-адрес.
  • token_endpoint_url : конечная точка выдачи ключей. Все запросы на получение ключей доступа и ключей обновления необходимо направлять на этот URL-адрес.
  • resource_server_url : URL-адрес сервера ресурсов, по которому нужно обращаться, чтобы получить доступ к защищенному ресурсу, передавая ему ключ доступа в заголовке авторизации.
  • approval_prompt_key : имя параметра, который используется сервером авторизации для определения состояния формы утверждения. Как правило, каждый сервер авторизации (Salesforce, Google, IBM и т.д.) имеет специальный параметр, который необходимо передать в составе запроса кода авторизации, чтобы указать, должен ли клиент предлагать форму утверждения каждого запроса. Имя этого параметра в Google — approval_prompt . В Salesforce это login consent .
  • access_type_key : имя параметра, который используется сервером авторизации для определения типа доступа. Как правило, каждый сервер авторизации (Salesforce, Google, IBM и т.д.) имеет специальный метод, с помощью которого клиент может в запросе ключа доступа сообщить, что вместе с ключом доступа ему нужно получить ключ обновления. В Google это делается посредством параметра access_type . В SalesForce требуется ввести значение refresh_token в качестве области действия.
  • access_type_value : значение параметра access_type_key . В Google необходимо передать значение offline , чтобы сервер, помимо ключа доступа, выслал ключ обновления.

Страница index.html примера кода клиента показана на рисунке 2. Эта страница открывается после успешной настройки проекта в Eclipse и его развертывания в Tomcat.

Рисунок 2. Домашняя страница примера клиента

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

Чтобы запустить клиент:

  • сначала введите все необходимые значения в файл Oauth2Client.config;
  • нажмите кнопку Start Test, чтобы получить ключ доступа. HTTP-запрос GET направляется в сервлет OAuth2Client, доступный по следующему URI: http://localhost:8080/OAuth2.0_AuthCode/handler;
  • код интерфейса пользователя передает следующий параметр запроса в рамках вызова сервлета OAuth2Client: caller=token (access token request), caller=resource (access protected resource request) .

Код клиента, приведенный в листинге 6, – это выдержка из метода doGet класса OAuth2Client.

Листинг 6. Фрагмент метода doGet из примера кода клиента


Замечания к листингу 6.

  • Клиент получает параметры запроса, caller и code . Если запрос был отправлен интерфейсом пользователя, как показано выше, то параметр caller будет иметь допустимое значение; в противном случае запрос отправлен сервером авторизации в рамках вызова переадресации, и code будет иметь допустимое значение.
  • Затем код клиента создает компонент OAuthDetails , считывая параметры из файла OAuth2Client.config .
  • После этого компонент проверяется на правильность и полноту. Если найдены недопустимые или отсутствующие параметры, то в пользовательский интерфейс направляется соответствующее сообщение об ошибке с указанием недостающих/недопустимых параметров.
  • Затем код клиента переходит к проверке и вызову запрошенной операции.

Запрос ключа доступа

В коде, приведенном в листинге 7, показано, как сделать запрос кода авторизации.

Листинг 7. Код запроса кода авторизации

Замечания по коду из листинга 7.

  • Код начинается с создания метода HttpPost , который используется для передачи параметров в URL-кодировке.
  • response_type , client_id и redirect_uri – это обязательные параметры, которые включаются в запрос.
  • Другие, необязательные параметры, такие как state , scope , approval_prompt_key/value и access_type_key/value , добавляются, если в файле конфигурации содержались их действительные значения.
  • DefaultHttpClient используется для запроса к серверу авторизации.
  • Сервер авторизации проверяет параметры запроса и отвечает HTTP-кодом переадресации 302 и заголовком Location .
  • Программа распознает код 302, полученный от сервера авторизации, и извлекает из заголовков ответа Location .
  • Заголовок Location содержит URI, необходимый клиенту для переадресации агента пользователя (веб-браузер). URI, как правило, – это приглашение для владельца ресурса войти в систему и дать подтверждение клиента.
  • Местоположение URI возвращается в вызывающий метод ( OAuth2Client.doGet() ).
  • Метод Oauth2Client.doGet() перенаправляет ответ по адресу URI.
  • Теперь агент пользователя владельца ресурса (веб-браузер) перенаправляется на страницу входа/утверждения, где владелец ресурса должен войти и утвердить клиента, выполняющего запрос.
  • После этого сервер авторизации использует URI переадресации, переданный в исходном запросе кода авторизации, для отправки значения code .

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

Листинг 8. Пример кода запроса ключа доступа

Замечания к листингу 8.

  • Для запроса ключа доступа к конечной точке выдачи ключей использует метод HttpPost .
  • grant_type , code и client_id – это обязательные параметры.
  • Если client_secret действителен, то он также включается в запрос.
  • Значение code – это код, возвращенный сервером авторизации в предыдущем запросе.
  • Если запрос действителен, то конечная точка выдачи ключей возвращает ключ доступа и маркер обновления, если это запрос доступа в автономном режиме.
  • Обратите внимание, что URI переадресации, передаваемый в этом запросе, должен быть идентичен тому, что отправлен в запросе кода авторизации. Конечная точка выдачи ключей проверяет, что URI переадресации совпадает с указанным в приложении клиента, данные которого доступны для конечной точки выдачи ключей.

Ключ обновления

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

Листинг 9. Пример кода обновления ключа доступа

Замечания к листингу 9.

  • Для отправки запроса к конечной точке выдачи ключей код использует метод HttpPost .
  • Параметры grant_type и refresh_token обязательны.
  • Если параметры client_id , client_secret и scope действительны, то они также включаются в запрос.
  • Если запрос действителен, то конечная точка выдачи ключей возвращает новый ключ доступа.

Доступ к защищенному ресурсу

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

Листинг 10. Пример кода доступа к защищенному ресурсу

Замечания к листингу 10.

  • Этот метод заполняет компонент OauthDetails значениями из файла конфигурации.
  • Как подсказывает название, этот метод использует простой метод HttpGet , чтобы получить защищенный ресурс на сервере ресурсов.
  • Для аутентификации на сервере ресурсов нужно передать ключ доступа в заголовке авторизации. Например, Authorization: Bearer accessTokenValue .
  • Код создает компонент DefaultHttpClient , чтобы сделать запрос get к серверу ресурсов.
  • Если код ответа сервера ресурсов 401 или 403, то ключ доступа, используемый для аутентификации, недействителен или просрочен.
  • На следующем шаге выполняется регенерация ключа доступа (см. Листинг 9).
  • После успешной регенерации ключа доступа код обновляет значение ключа доступа в компоненте OauthDetails . Он заменяет существующий заголовок авторизации в методе get новым значением ключа доступа.
  • Затем код делает другой запрос доступа к защищенному ресурсу.
  • Если ключ доступа действителен и URL-адрес сервера ресурсов правильный, то вы увидите содержимое ответа в окне консоли.

Тестирование клиента в Salesforce.com

Регистрация с помощью Salesforce.com

Salesforce.com – это популярное приложение типа «программное обеспечение как услуга» (SaaS), которое поддерживает грант кода авторизации OAuth 2.0.

Для регистрации в Salseforce.com:

  1. Нажмите кнопку Login и выберите Sign up for free.
  2. Выполните регистрацию и получите реквизиты.
  3. Помимо имени пользователя и пароля, вы также получите ключ безопасности. Пароль, передаваемый в запросе ключа доступа, должен состоять из вашего пароля и ключа безопасности (например, password12312123 ).
  4. См. ссылку в разделе Ресурсы на полезную статью о том, как создать приложение в salesforce.com.
  5. URI переадресации, который указывается при создании приложения, salesforce.com использует для передачи гранта кода авторизации.

Выполнение примера клиента в Salesforce.com

Теперь, когда мы создали в Salesforce свой собственный OAuth 2.0-совместимый сервер, можно протестировать наш клиент и получить защищенную информацию с сервера.

Файл Oauth2Client_salesforce.config находится в папке Java resources/src. Это файл конфигурации, настроенный для salesforce.com, который можно использовать в качестве шаблона для передачи значений конфигурации при тестировании в Salesforce.com.

Запустите веб-приложение Oauth2Client на сервере Tomcat, как показано выше, чтобы открыть начальную страницу проверочного клиента (см. Рисунок 3).

Рисунок 3. Страница проверочного клиента SalesForce

Рисунок 3 иллюстрирует страницу проверочного клиента. Нажмите кнопку Start Test, чтобы получить ключ доступа. Вы увидите приглашение войти для запроса ключа доступа Salesforce, как показано на рисунке 4.

Рисунок 4. Запрос ключа доступа Salesforce (приглашение войти)

На рисунке 4 показана страница входа Salesforce, на которую клиент перенаправляет агент пользователя (веб-браузер) после получения от Salesforce.com сообщения 302 и заголовка Location .

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

Рисунок 5. Запрос ключа доступа Salesforce (приглашение подтвердить)

На рисунке 5 показано предложение владельцу ресурса (после входа в систему) подтвердить предоставление доступа к приложению VarunOAuth2.0, которое представляет собой пример кода, запрашивающий доступ к данным владельца ресурса.

Ответ SalesForce с ключом доступа

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

Листинг 11. Ответ SalesForce с ключом доступа

Получение пользователем информация от сервера Salesforce

Теперь, при наличии ключа доступа, можно обращаться за информацией к учетной записи владельца ресурса на Salesforce, которая требует проверки подлинности OAuth 2.0.

Добавьте ключ доступа и ключ обновления в файл Oauth2Client.confg. Кроме того, установите параметр URL сервера ресурсов, указав URL, который требуется протестировать. Например, можно настроить его в соответствии с полем id , которое Salesforce возвратил в своем ответе на запрос ключа доступа. Поле id используется для доступа к данным учетной записи владельца ресурса (например, https://login.salesforce.com/id/00D90000000mQaYEAU/00590000001HCB7AAO ).

Обновите проект и снова запустите его на сервере Tomcat. Нажмите кнопку Start Test, чтобы обратиться к защищенным ресурсам.

В окне консоли Eclipse появится текст, подобный листингу 12.

Листинг 12. Распечатка информации с защищенного ресурса SalesForce

Как видите, мы успешно получили доступ к информации из учетной записи владельца ресурса Salesforce с использованием метода аутентификации OAuth 2.0. Когда указанный в файле конфигурации срок действия ключа доступа истечет, клиент автоматически обновит его и будет использовать для извлечения защищенного ресурса, доступного по URL-адресу сервера ресурсов.

Регистрация в Google

Google использует OAuth 2.0 для аутентификации API, которые могут использоваться для доступа к таким службам, как GoogleDrive, TaskQueue и CloudSQL. Чтобы настроить приложение для тестирования клиента OAuth 2.0 с Google, следуйте инструкциям, приведенным на странице https://developers.google.com/accounts/docs/OAuth2?hl=ES.

Запуск клиента с Google

Теперь, когда мы создали свой OAuth 2.0-совместимый сервер, можно протестировать наш клиент и получить защищенную информацию с сервера.

Файл Oauth2Client_Google.config находится в Java resources/src. Этот файл конфигурации настраивается для работы со службами Google и может использоваться в качестве шаблона для предоставления значений конфигурации.

Запустите веб-приложение Oauth2Client на сервере Tomcat, как показано выше. Процесс и результаты операций по получению ключа доступа и выполнению доступа к защищенным ресурсам показаны на рисунке 6.

Рисунок 6. Запрос ключа доступа Salesforce (приглашение войти)

На рисунке 6 показана страница входа Google, на которую клиент перенаправляет агент пользователя (веб-браузер) после получения от Google сообщения 302 и заголовка Location .

На рисунке 7 показано предложение владельцу ресурса (после входа в систему) подтвердить предоставление доступа к приложению Cast Iron App, которое обращается к данным владельца ресурса.

Рисунок 7. Запрос ключа доступа (приглашение подтвердить)

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

Листинг 13.

Получение сведений о пользователе от сервера Google

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

Отредактируйте файл Oauth2Client.confg, указав ключ доступа и ключ обновления, и заполните параметр url , указав URL-адрес сервера ресурсов, который вы хотите протестировать. Я заменю его на https://www.googleapis.com/drive/v2/about, который представляет собой URL-адрес учетной записи GoogleDrive.

Теперь обновите проект и снова запустите его на сервере Tomcat. Нажмите кнопку Start Test, чтобы обратиться к защищенному ресурсу.

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

Листинг 14.

Как видите, вы успешно получили доступ к информации из учетной записи владельца ресурса GoogleDrive с использованием метода аутентификации OAuth 2.0.

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

Тестирование клиента с конечными точками IBM

Этот пример кода клиента успешно протестирован с OAuth 2.0-совместимыми конечными точками IBM, а именно, IBM® WebSphere® Application Server и IBM Datapower®.

Инструкции по настройке сервера OAuth 2.0 на сервере Websphere Application Server находятся в документе Использование OAuth: Подключение поставщика услуг OAuth к WebSphere Application Server.

Конечные точки IBM можно тестировать тем же способом, что и Salesforce или Google.

Заключение

В третьей части этой серии руководств объясняются основы гранта кода авторизации. Она демонстрирует, как написать на языке Java универсальный клиент OAuth 2.0, который устанавливает соединение с разными OAuth 2.0-совместимыми конечными точками и получает от них защищенные ресурсы. Пример веб-проекта клиента, приведенный в разделе Загрузки, можно импортировать в среду Eclipse и использовать в качестве отправной точки для создания специального клиента Oauth 2.0.

Коды ответов сервера: исчерпывающий список кодов ошибок HTTP

Довольно часто вы можете столкнуться с такими ошибками, как 404 и 301, но есть много кодов статуса HTTP, с которыми вы, вероятно, не знакомы.

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

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

1xx информационные коды

100 Continue Server Code (Продолжение кода сервера)
Код 100 Continue обозначает «нормальную работу». Он указывает, что пользователь сделал качественный запрос, и сервер начал его обрабатывать. Это временный код статуса HTTP, появляющийся лишь в тех отдельных случаях, когда пользователь ожидает окончательный ответ со стороны сервера. Он возникает только после отправки последнего пакета данных.

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

101 Switching Protocols (Переключение протоколов)
Вероятно, это один из простейших кодов сервера. Он означает, что пользователь попросил переключить используемый тип протокола, и веб-сервер согласился на такой шаг.
Когда вы можете его применить? Если осуществляется переход на новую версию HTTP из старой версии протокола. Такой запрос будет выполняться только в том случае, если существует более подходящий протокол (другими словами, если есть более новая версия HTTP).

102 Processing (Обработка)
Поскольку запрос WebDAV (протокол передачи), кроме основного запроса может включать и ряд других подзапросов, подразумевая также и файловые операции, то для его выполнения может потребоваться больше времени.
Когда можно использовать этот код? Он создается для того, чтобы уведомить пользователя и обнулить таймер. Дальше будет активировано ожидание следующей директивы в стандартном режиме, поскольку обработка запросов способна затянуться по времени.

2xx Success (Успех)

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

200 OK
Код состояния 200, наверное, является наиболее популярным, но в то же время очень неприметным в плане использования. Он указывает, что передача данных между сервером и пользователем подошла к завершению, и все прошло так, как должно.
Когда этот код нужно использовать? Постоянно!

201 Created (Создан)
В связи с успешным выполнением запроса создался новый ресурс. К примеру, благодаря запросу юзера сгенерирован такой ранее не существующий веб-ресурс, как новая страница. Исходной сервер настроен так, что обязан создать ресурс еще до отправки 201 кода. Если документ не может быть сгенерирован своевременно, сервер использует в качестве альтернативы код 202 (принят).

202 Accepted (Принят)
Текущий запрос был передан в стадию обработки, но в силу объективных факторов является незавершенным. Запрос к серверу может быть не завершенным, это зависит от факта, успешно ли прошла обработка и не отклонили ли его.

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

203 Non-Authoritative Information (Недостоверная информация)
Серверу удалось полностью обработать запрос, но передаваемые данные не были взяты из первостепенного источника (резервная копия, другой сервер и т. д.) и поэтому информация может быть нерелевантной. Этот код имеет большое сходство с 200 серверным ответом, но указывает, что данные не были получены из источника.

Когда применяют подобный ответ сервера? Ним можно заменить 200 код, если отправитель имеет веские основания полагать, что заголовки ответов из внешнего источника отличаются от тех, которые были предоставлены исходным сервером.

204 No Content (Нет контента)
Этот код является ответом сервера, который указывает, что запрос получили и поняли. Но при этом не существует данных, которые могут быть отправлены пользователю. В основном такой код используется для активации скриптов без необходимости внесения изменений в веб-документ. Нужно, чтобы указанный код не содержал основного сообщения, и он должен быть вставлен в первую строку с кодом, которая является доступной сразу после заголовка.

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

205 Reset Content (Сброс контента)
Код обозначает успешную обработку запроса сервером c отсутствующим возвратом контента. В отличие от 204 кода, этот ответ требует, чтобы документ был обновлен.

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

206 Partial Reset (Частичный сброс)
Сервер возвращает только часть контента, которая соответствует заголовку, отправленному клиентом. В основном его используют расширенные инструменты кэширования. Такое бывает, когда пользователь хочет получить лишь небольшую часть контента страницы, а сервер в своем ответе предоставляет данные только для этой части страницы.

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

207 Multi-Status (Мультистатус)
Сервер параллельно предоставляет результаты нескольких независимых операций, которые включаются в тело сообщения в виде XML-документа.

3xx Редирект

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

300 Multiple Choices (Множественный выбор)

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

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

301 Moved Permanently (Удален навсегда)
Это общий запрос пользователя, который означает, что запросы на этот ресурс (а также запросы, которые последуют за ним) следует перенаправить на указанный URL.

Когда он используется? Когда страница потеряна, больше не существует, или линк, ведущий на внешний документ, больше неработоспособен. 301 редирект дает пользователю понять, что запрошенный ресурс переместили. В основном он выполняется с помощью файла .htaccess, который доступен на серверах Apache.

302 Found (Найден)
Этот код говорит пользователю, что местоположение запрашиваемого веб-документа было временно изменено, а код состояния 302 включает данные о новом размещении, к которому пользователь может делать запрос.

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

303 See Other (Смотреть другой)
Он является индикатором того, что искомый ресурс можно найти по URL-адресу, который отличный от того, что указан в запросе. Это не обязательно значит, что ресурс был перемещен. Этот код только предоставляет адрес, который должен запрашиваться при аналогичном ответе.

Когда может применяться этот код? Этот способ в основном существует, чтобы позволить выходным файлам POST-активированных скриптов перенаправлять агента пользователя на избранный веб-ресурс.

304 Not Modified (Не изменен)
304 означает, что пользователь запрашивает документ / ресурс только тогда, когда он был изменен с момента последних обновлений кеша этого документа.

В каких случаях может применяться этот код? Если ответ сервера сообщает вам, что параметры документа If-Modified-Since или If-Match не изменились со времени генерирования последнего кеша. Тогда нет нужды повторно отправлять ресурс на проверку.

305 Use Proxy (Использовать прокси)
305 код дает понять пользователю, что доступ к запрашиваемому ресурсу осуществим только через прокси-сервер, указанный в ответе.
Когда он показывается? Он часто отображается в связи с мерами безопасности и обеспечивает доступ к запрашиваемым URL-адресам.

306 Switch Proxy (Переключить прокси)
Изначально он означал, что «последующие запросы должны использовать указанный прокси», но в настоящее время не используется.

307 Temporary Redirect (Временный редирект)
Такой код отображается, если открываемый ресурс временно используется для другого URL-адреса, который также содержится в ответе. 307 немного отличается от 302 кода – он является его более конкретной версией.

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

4хх Ошибка клиента

Класс ответов 4xx указывает на ошибки на стороне клиента или тот факт, что местоположение никогда (или уже) не существовало.

400 Bad Request (Плохой запрос)
Запрос не обрабатывается правильно в связи с синтаксической ошибкой.
Для чего предназначен этот код? Если пользователь делает запрос на информацию, но при этом пренебрегает протокольными правилами передачи гипертекста. Запрос не следует делать повторно без надлежащих перемен в синтаксисе.

401 Unauthorized (Неавторизирован)
Он имеет отношение к запросу ресурса, который нуждается в авторизации. Код 401 информирует, что предварительную авторизацию отклонили, поскольку переданные пользовательские данные были неверные.

Когда он отображается? В случаях, если пользователь делает запрос и использует при этом некорректные входные данные для авторизации (среди них, логин и пароль).

402 Payment Required (Требуется оплата)
Этот код сервера забронирован на будущее. Но, изначально предполагалось, что такой статус можно будет использовать при расчетах специальными формами электронных денег. Но ему так и не нашлось применения.

Какова сфера применения этого кода? Старый сервис Apple MobileMe сообщал об 402-ошибке, если аккаунт пользователя в MobileMe подозревался в любой форме злоупотреблений его ресурсами. Также видеохостинг Youtube использует этот статус, если некий IP-адрес использует чрезмерно большое количество запросов. Поэтому пользователю приходится ввести CAPTCHA.

403 Forbidden (Запрещен)
Пользователь пробует добиться доступа к веб-ресурсу, на который у него нет прав, а авторизация здесь никак не может помочь.
Что насчет применения этого кода? Он используется, когда сервер может понять запрос, но не разрешает выполнить его, поскольку у клиента имеются ограничения доступа к текущему разделу. Обычно такое наблюдается, если веб-ресурс не предназначен для открытого доступа.

404 Not Found (Не найден)
Большинство пользователей знакомо с 404 ошибкой. Она указывает на то, что искомый ресурс невозможно найти, но в будущем – когда он может появиться там – к нему можно получить доступ. Также здесь разрешаются все следующие обращения от клиента. Но в большом количестве таких случаев используется код редиректа класса 3xx, и пользователь перенаправляется на альтернативный ресурс или местоположение.
Когда демонстрируется этот код? Довольно часто, особенно если страницу удалили или переместили. Часто в таких случаях сервер в автоматическом режиме генерирует доступную страницу с ошибкой 404.

405 Method Not Allowed (Метод не разрешен)
Метод, посредством которого осуществляется запрос к ресурсу, является недоступным. Иными словами, появляется ошибка при попытке использовать функцию в формате GET, тогда как требуется ввод данных через метод POST (либо с помощью метода PUT с веб-документами только для чтения).

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

406 Not Acceptable (Недопустимо)
Запрашиваемый ресурс имеет возможность генерировать только тот контент, который не может использоваться в Accept-хедерах самого запроса. Браузер может обеспечить сервер характеристиками данных, которые будут приниматься из сервера.

В каких случаях такой код может быть использован? В ситуациях, когда форма файла ресурса, который запрашивается не подходит под формат, доступный для распознавания пользователем. Речь здесь идет прежде всего о языке программирования, а не о английском!

407 Proxy Authentication Required (Нужна авторизация прокси)
Как и статус-код 401, значение 407 обозначает, что клиенту следует предварительно авторизоваться через прокси-сервер. Для выполнения этого действия и осуществления процесса авторизации, прокси-сервер должен вернуть поле с заголовком Proxy-authenticate, которое отвечает стандартам, предъявляемым сервером.
Когда появляется этот статус-код? В случаях, если сервер «убежден», что запрос данных от клиента является правильным, но получить доступ к веб-ресурсу возможно лишь через авторизацию с помощью прокси-сервера.

408 Request Timeout (Тайм-аут запроса)
Истекло время ожидания сервером ретрансляции от клиента.
Когда такой статус-код применяться? Используя спецификацию W3 HTTP: «Со стороны клиента не поступало запроса в выделенном временном интервале, когда его ждал сервер. Клиент имеет возможность повторить запрос в любое время».

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

410 Gone (Исчез)
Сервер дает подобный ответ, если раньше ресурс находился по определенному URL-адресу, но его удалили и на данный момент он недоступен. Пользователю не следует несколько раз повторять одно и то же самое обращение.

Когда применяется такой статус-код? В ситуации, когда уже не представляется возможным получить доступ к ресурсу посредством этого запроса, а на сервере не содержатся данные о гипотетическом местонахождении ресурса. Если сервер подозревает, что веб-документ могут восстановить в ближайшие сроки, то клиенту лучше передать код 404.

411 Length Required (Требуется длина)
Запрос не указывает длину контента, и запрашивался в совершенной форме.
Когда этот код показывается? Когда браузер не определяет длину запрашиваемого содержимого в заголовке запроса. Сервер не будет принимать запрос без валидного поля заголовка контента.

412 Precondition Failed (Сбой предварительного условия)
Сервер не отвечает на одно из предварительных условий, которые отправитель указал в запросе. Иными словами, один или несколько заголовков запросов были возвращены с атрибутом false.

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

413 Request Entity Too Large (Объект запроса слишком большой)
Код 413 отображается в случаях, когда сервер отказывается обрабатывать запрос, потому что тело запроса слишком велико.
Когда этот код может применяться? При использовании метода POST с контентом, который больше по объему, чем сервер, способен обработать.

414 Request-URL Too Long (URL запроса слишком длинный)
Этот код отображается, когда сервер не может обработать запрос, потому что указанный URL слишком длинный.
Когда этот код может применяться? Когда POST-запрос преобразуется в GET-запрос. POST-запрос поддерживает отправку неограниченного количества данных, объединяя их при обращении к серверу. Однако, если запрос должен быть преобразован в GET-формат, он позволит привязать данные формы к URL-адресу, что даст возможность хранить информацию в больших размерах, чем она была доступна.

415 Unsupported Media-Type (Неподдерживаемый тип)
Код 415 отправляется, для указания, что сервер заметил часть запроса, которая была сделана в неподдерживаемом формате.
Когда отображается такой код? Когда в запросе не указываются какие-либо типы носителей, поддерживаемые ресурсом или сервером. Например, пользователь запрашивает изображение в расширении, которое не поддерживается веб-сервером. Сервер знает, что запрашивалось, но не понимает формат, в котором хотели получить ресурс.

416 Requested Range Not Satisfiable (Диапазон не подходит)
Этот ответ пользователь получает, когда он запрашивает часть ресурса, но в то же время этот фрагмент не может быть предоставлен.
Когда такой статус может применяться? Когда сервер запрашивает байты XXX-YYY ресурса, но ресурс немного меньше, чем указано при обращении.

417 Expectation Failed (Ошибка ожидания)
Такой статусный ответ получают, когда по какой-то причине сервер не удовлетворяет значение поля Expect заголовка запроса.
Когда этот код может применяться? Все абсолютно прозрачно. Когда один из заголовков запросов, заголовок «Expect», получает обращение, на которое сервер не в состоянии ответить.

418 I’m a teapot (Я чайник)
Этот код был создан в 1998 году как одна из традиционных шуток на первое апреля IETF, в RFC 2324, как Hyper Text Coffee Pot Control Protocol и вряд ли он когда-нибудь будет обрабатываться современными HTTP-серверами.

Может ли он использоваться? Конечно нет, все это было -15 лет назад и делалось ради смеха.

422 Unprocessable Entity (Необрабатываемый объект)
Сервер принял запрос и понял его суть, но не может выполнить обращение из-за содержания в нем некоторых семантических ошибок.
Когда используется этот статус-код? Когда на стороне сервера прошло успешное принятие обращения, и сервер способен работать с указанным форматом данных; в теле запроса XML-документ содержит правильные синтаксические конструкции, но также в нем содержится какая-либо логическая ошибка, в связи с которой не представляется возможным управлять ресурсом.

423 Locked (Заблокирован)
Целевой ресурс, указанный в запросе, блокируется в связи с применением к нему определенного метода. Чтобы сделать ресурс доступным, следует разблокировать его или предоставить корректные данные авторизации.
Когда этот код может применяться? Когда ресурс является закрытым, в основном это делается в целях обеспечения безопасности.


424 Failed Dependency (Неудачная зависимость)
424 код сообщает, что выполнение текущего запроса напрямую зависит от успешности другой операции, и если она не будет правильно завершена, то вся обработка запроса остановится.

425 Unordered Collection (Неупорядоченная коллекция)
Код 425 показывается пользователю, когда ресурс определяется одним из черновиков расширенного протокола коллекций WebDAV (Advanced Collections Protocol), но отсутствует в Advanced Collections Protocol и Versioning Ordered Collections Protocol.

426 Upgrade Required (Нужно обновление)
Этот код показывается, когда сервер дает клиенту инструкции по обновлению протокола (переключения на другой или новый протокол) Когда используется код? Обычно, когда в браузере используются устаревшие протоколы.

428 Precondition Required (Требуется предпосылка)
Исходный сервер требует указать предварительные условия при обращении. Этот код разработан во избежание конфликтных версий ресурса в тех ситуациях, когда клиент получает (GET) состояние ресурса, изменяет и отправляет (PUT) его обратно на сервер, и в то же время какая-то третья сторона также изменяет местоположение прямо на севере, что приводит к конфликту.

Когда этот код может применяться? По запросу индикации условий, сервер как бы дает гарантии клиентам, что они используют правильную текущую копию ресурса. Если это не совсем так, то пользователь получает ошибку 428.

429 Too Many Requests (Слишком много запросов)
Этот ответ отправляется, если со стороны клиента поступало слишком большое количество обращений за короткий промежуток времени.
Когда используется этот код? Когда пользователь отправляет слишком много обращений за краткосрочный период.

431 Request Header Fields Too Large (Поля заголовков слишком большие)
Появляется, когда сервер не намерен совершать обработку запроса, поскольку какое-нибудь из полей заголовка (или все существующие поля) слишком велики.
Когда он применяется? Базово, когда заголовок запроса, поступающий от юзера больше, чем способен обработать сервер. Обращение можно повторить после того, как поля заголовка в нем будут сокращены.

444 No Response (Нет ответа)
Используется в лог-файлах сервера Nginx, для указания, что сервер не передавал информацию обратно пользователю и закрыл соединение.
Какова сфера применения кода? В основном он использовался как инструмент защиты от вредоносного софта.

449 Retry With (Microsoft) (Повторить попытку)
Расширение Microsoft, которое указывает, что запрос следует повторить после завершения соответствующего действия.
Когда этот код может применяться? Он часто создается, когда настройки запроса не соответствуют тому, что способен проверить сервер.

450 Blocked by Windows Parental Controls – Microsoft (Заблокировано родительским контролем Windows)
Расширение Microsoft. Эта ошибка возникает, когда в параметрах родительского контроля Windows установлена блокировка доступа к некоторым веб-документам.
Когда применяется 450 код? В случае, если родители (зная об этой функции) прибегают к использованию родительского контроля, а id-access запросил доступ к заблокированному ресурсу.

451 Unavailable For Legal Reasons (Недоступен по юридическим причинам)
Новый HTTP-код статуса для ресурсов, которые заблокированы по юридическим соображениям. Применяется, чтобы указать, что доступ к нужному веб-ресурсу заблокировали по юридическим мотивам: например, посредством цензуры или правительства.

5xx Ошибка сервера

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

500 Internal Server Error (Внутренняя ошибка сервера)
Этот статус сообщает о внутренней ошибке сервера, которая не совпадает с другими ошибками того же класса.
Этот код используется, если ресурс или ссылка создается на сервере (например, календарь в системе резервирования), который технически не существует как ссылка или доступный ресурс, но пользователь видите их как ссылки.

501 Not Implemented (Не поддерживается)
Сервер либо не понимает метод запроса, либо не поддерживает инструкции, нужные, чтобы обработать обращение.
Вы можете столкнуться с указанным кодом 501, когда сервер не имеет поддержки стандартных протоколов запросов, среди которых GET, OPTIONS, HEAD, POST и т. д.

502 Bad Gateway (Плохой шлюз)
Пользователь увидит 502 код, если сервер, работает в качестве шлюза или прокси-сервера, и он получил недопустимый ответ от сервера верхнего уровня.
Когда используется подобный код? Обычно, когда сервер высшего уровня и прокси / шлюз не согласованы с протоколами, которые представленными в обращении. Как результат появляется ошибка обмена данных.

503 Server Unavailable (Сервер недоступен)
Код 503 означает, что возникли технические причины, из-за которых сервер на определенное время не способен обработать набор данных.
Его допустимо использовать в случаях, когда на сайт есть повышенный спрос, но у сервера нет возможности обрабатывать все входящие запросы.

504 Gateway Timeout (Тайм-аут шлюза)
Сервер как шлюз или прокси-сервер не дождался ответа от вышестоящего сервера, чтобы завершить текущий запрос.
Когда этот код может применяться? Когда прокси или шлюз используют как канал передачи данных, а два сервера при этом ожидают на ответ.

505 HTTP Version Not Supported (Версия HTTP не поддерживается)
Сервер не поддерживает версию HTTP протокола, обозначенную при обращении к нему.
Где используется такой код? В тех случаях, которые были указаны выше! Если HTTP протокол более старый, чем нужно серверу, и, как следствие, он не поддерживается.

506 Variant Also Negotiates (Вариант также перенаправляется)
Такой ответ сервера последует, если при оформлении ошибочной конфигурации выбранный параметр указывает сам на себя, что приводит к прерыванию процесса связи.
Когда он применяется? Когда сервер настроен неправильно и не может обработать запрос.

507 Insufficient Storage (Недостаточно места)
Ошибка 507 имеет место, когда сервер не может разместить данные, поскольку для текущего запроса недостаточно пространства.
Этот код может быть применен, когда сервер загружен в полном объеме, а пользователь запрашивает ресурс, который уже имеется в наличии. Трудность здесь заключается в том, что на сервере нет места для хранения отправленных в запросе данных, чтобы отправить запрашиваемый ресурс.

509 Bandwidth Limit Exceeded (Превышена пропускная способность)
Этот код ответа используется, когда веб-сайт лимитирует ограничение трафика, предназначенное для него.
Когда используется этот статус? Когда Apache запускает правильное расширение, а ISP имеет пропускную способность, которая может быть скоро превышена. Здесь имеется несколько форм ограничения.

510 Not Extended (Нет расширения)
Код 510 появляется, когда на сервере нет расширения, которое хочет использовать клиент. Когда этот код появляется? Когда сервер требует больше данных в запросе.

511 Network Authentication Required (Требуется аутентификация сети)
Этот статус-код демонстрируется, если клиенту следует сначала авторизоваться в сети, к примеру, необходимо ввести пароль для платного доступа в сеть Интернет.
Когда используется этот код? Когда пользователь сначала должен дать свое согласие на условия использования, прежде чем он получит доступ к Интернету (например, к Wi-Fi точке доступа).

Урок 39. Списки контроля доступа ACL (Access List Control)

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

Запретить/разрешить мы можем на основе IP адресов, портов и задействованных протоколов. На этом принципе и работают списки управления доступом ACL ( Access Control List ).

Другим примером использования списков доступа является запрет поступающих на маршрутизатор пакетов протокола ICMP. Как мы знаем с помощью ICMP работают утилиты Ping, Traceroute/Tracert. С помощью данных утилит можно просканировать сеть, а это нежелательно с точки зрения политики безопасности каждой сети.

Списки доступа позволяют фильтровать трафик на входе и выходе интерфейса маршрутизатора.

И в чем же разница?

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

Когда ACL настроены на выходе интерфейса, то трафик фильтруется сразу же после процесса маршрутизации:

Данная особенность может быть полезна при определенных обстоятельствах.

Так что же из себя представляют списки доступа и как они работают?

Списки доступа содержат просто набор инструкций какие порты и адреса блокировать, а какие наоборот разрешить. Этих инструкций может от нескольких единиц до десятков.

При поступлении трафика проверка списка доступа начинается сверху вниз, то есть с первой инструкции. Как только будет найдено совпадение проверка списка прекратится и будет выполнено действие, указанное в инструкции (заблокировать или пропустить).

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

Cisco IOS поддерживает 3 типа ACL:

  • стандартные списки
  • расширенные списки
  • именованные списки

Стандартные списки позволяют проверять только IP адрес отправителя. Например,в нашем 1-ом примере доступ в интернет Алисе и Кате можно закрыть с помощью стандартного списка. В данном случае блокируется абсолютно весь трафик, проходящий через маршрутизатор. Стандартные списки доступа рекомендуется устанавливать как можно ближе к отправителю.

Расширенные списки позволяют фильтровать пакеты на основе адресов, портов и протоколов получателя и отправителя.

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

Электронная почта работает по протоколам POP/SMTP (порты 110/ 25). Следовательно можно внести исключение в списки доступа исходя из выше описанных условий.

То же самое касается и IP телефонии — выбираем задействованный протокол и порт и вносим в список доступа.

Расширенные списки рекомендуется устанавливать ближе к получателю.

Именованные списки являются теми же стандартными и расширенными ACL, однако предоставляют более гибкие возможности для редактирования (об этом немного позже).

Рассмотрим какие команды используются в каждом типе ACL, а затем применим их на примере.

Инструкция задается следующей командой:

Router(config)# access-list номер permit | deny IP_адрес_отправителя инвертированная_маска (wildcard mask)

Router(config)# access-list 1 deny 192.168.1.0 0.0.0.255

Router(config)# access-list 1 permit 10.1.0.0 0.0.255.255

Router(config)# access-list 1 deny any

Номер списка принимает значения от 1 до 99. Цифры не означают приоритет или упорядоченность. Это просто номер списка. Затем следует команда permit (разрешить) или deny (запретить). С помощью инвертированной маски (wildcard mask) мы можем определить диапазон адресов, на которые будет распространяться запрет/разрешение.

В первой команде мы запрещаем сеть 192.168.1.0/24, а во второй разрешаем сеть 10.1.0.0/16.

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

А как работает инвертированная маска (wildcard mask)?

Работа инвертированной маски основана на следующем принципе.

На тех битовых позициях, где установлен 0 IP адрес устройства должен совпадать с адресом, указанным в настройках ACL.

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

Пример №1

Необходимо разрешить доступ диапазону адресов 192.168.1.0 — 192.168.1.255. Так как первые 3 октета должны совпадать полностью, а четвертый может принимать любые значения, то используем маску 0.0.0.255. Вот как это выглядит на рисунке

Пример №2

К диапазону 192.168.1.0-192.168.1.255 добавим еще один диапазон 192.168.2.0 — 192.168.2.255.

Теперь у нас должны совпадать первые 2 октета полностью и первые 6 бит третьего октета. Поэтому маска у нас 0.0.3.255. А в настройках ACL мы укажем адрес 192.168.0.0. Можно, конечно, указать сразу 2 отдельные команды на каждый диапазон, с помощью маски мы можем сократить запись

Пример №3

Необходимо разрешить/запретить диапазон 200.40.0.4 — 200.40.0.7. У нас совпадают полностью первые 3 октета и первые 6 бит четвертого октета:

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

Router(config-if)# ip access-group номер_применяемого_списка in | out

in — входящий трафик

out — исходящий трафик

Алгоритм работы стандартного списка выглядит так:

Расширенный список доступа

Расширенные списки доступа имеют номера от 100 до 199.

Команды имеют довольно широкий набор опций, поэтому покажу наиболее общий пример команды:

Router(config)#access-list номер permit | deny протокол IP_адрес_отправителя инвертированная_маска порт_отправителя IP_адрес_получателя инвертированная_маска порт_получателя

Router(config)#access-list 100 permit tcp 192.168.1.0 0.0.0.255 eq 80 10.1.1.0 0.0.0.255 eq 443

Данная команда разрешает TCP трафик от хостов с диапазоном 192.168.1.0/24 на хосты с диапазоном 10.1.1.0/24. Причем порты отправителя должны быть равны 80, а порты получателя — 443. Если все эти условия соблюдаются, то пакет пропускается, если нет, то переходит к следующей команде.

Router(config)#access-list 100 deny tcp any host 172.16.1.5 gt 5000

А вот эта команда запрещает весь TCP трафик от любого хоста на конкретный хост с адресом 172.16.1.5. Причем запрет действует при условии, что запросы идут на порты получателя от 5001 и выше.

В конце списка всегда следует неявная команда, запрещающая весь трафик.

Не забудь определить интерфейс и направление трафика для фильтрации.

Вот как выглядит алгоритм работы расширенных списков:

Для просмотра настроек используй следующие команды:

Router# show running-config

Router# show ip access-lists

Router# show ip access-lists interface название_интерфейса

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

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

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

Синтаксис команд представлен ниже.

Для стандартных списков:

Router(config)# ip access-list standard название

Router(config-std-nacl)# permit host IP_адрес_отправителя

Router(config-std-nacl)# deny IP_адрес_отправителя инвертированная_маска

Для расширенных списков:

Router(config)# ip access-list extended название

Router(config-ext-nacl)# permit ip IP_адрес_отправителя инвертированная_маска IP_адрес_получателя инвертированная_маска

Router(config-ext-nacl)# deny tcp IP_адрес_отправителя инвертированная_маска порт_отправителя IP_адрес_получателя инвертированная_маска порт_получателя

Чтобы удалить ненужную команду достаточно узнать ее номер. Чтобы узнать номер введи команду:

Router# show ip access-list название

а затем укажи ее номер при удалении:

Router(config-ext-nacl)# no 10 — этого уже достаточно

Ну а чтобы добавить команду достаточно тоже указать номер и затем саму команду.

Обращаю твое внимание, что удаление и добавление строк списка происходит в режиме настройки ACL, например так:

Router(config-ext-nacl)# 5 deny ip any any

Пример использования списков доступа

Сеть состоит из 3 частей:

  • Внутренняя сеть — основная инфраструктура локальной сети любого предприятия.
  • Демилитаризованная зона DMZ — в ней располагаются сервера, которые доступны из интернета. Доступ во внутреннюю сеть из этой зоны закрыт из соображений безопасности.
  • Внешняя сеть — связывается напрямую с провайдером. Обычно состоит из маршрутизаторов и сетевых экранов (firewalls).

Именно по этому принципу и строятся сети предприятий.

Задача у нас следующая:

  1. Всем серверам из DMZ запретить доступ во внутреннюю сеть
  2. Всем серверам из DMZ разрешить двустороннюю связь в интернет
  3. Пользователям из интернета разрешить доступ на серверы в DMZ, учитывая протокол взаимодействия и порты TCP/UDP
  4. Разрешить доступ внутренним пользователям на серверы DMZ
  5. Запретить Алине и Саше доступ в интернет и DMZ, то есть они могут работать только во внутренней сети.

Пункт №1 можно решить с помощью расширенного списка на маршрутизаторе LAN_Router

На самом деле в данном примере серверы не имеет доступа к внутренним компьютерам, потому что подключены к различным интерфейсам маршрутизатора Firewall. Данный маршрутизатор ничего не знает о сети 192.168.1.0/24, поэтому не может перенаправить пакеты серверов к маршрутизатору LAN_Router. Однако достаточно маленькой ошибки в конфигурации и внутренние компьютеры станут доступны не только для DMZ, но и для внешней сети.

Поэтому список доступа на маршрутизаторе LAN_router безусловно необходим.

А какие ошибки могут привести к тому, что сеть LAN будет доступна для DMZ?

Например, на маршрутизаторе Firewall при настройке статического маршрута может быть по ошибке указан интерфейс, ведущий к маршрутизатору LAN_Router.

Или на маршрутизаторе LAN_Router будет выполнена команда redistribute connected . В данный момент между 2-мя маршрутизаторами настроен EIGRP. Если выполнить вышеназванную команду, то маршрутизатор Firewall узнает о сети LAN.

Пункты №2 и №3 не требуют списков доступа. Достаточно настроить правильно маршрутизацию и NAT на маршрутизаторе Firewall

Пункт №4. Внутренние пользователи уже имеют доступ в зону DMZ, однако связь будет работать только в одну сторону, так как мы закрыли доступ еще в п.1.

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

Решение простое — достаточно настроить NAT на маршрутизаторе LAN_Router. Тогда только внутренние пользователи смогут подключаться к серверам, а сервера уже не смогут из-за активированного списка доступа. Однако это не единственное решение

Пункт №5 решается с помощью стандартного списка

Вопросы и ответы по AWS IAM

Главная страница IAM

Сведения о продукте

Начало работы

Ресурсы и инструменты

Вопросы и ответы

Партнеры

Начать работу с AWS бесплатно

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

Общие вопросы

Вопрос. Что такое AWS Identity and Access Management (IAM)?
IAM AWS можно использовать для обеспечения безопасного индивидуального и группового доступа к ресурсам AWS. Вы можете создавать удостоверения пользователей («пользователей IAM»), управлять ими и предоставлять этим пользователям IAM разрешения на доступ к ресурсам. Можно также предоставлять разрешения пользователям, не зарегистрированным в AWS («федеративным пользователям»).

Вопрос. Как начать использовать IAM?
Чтобы начать использовать IAM, необходимо подписаться хотя бы на один сервис AWS, который интегрирован с IAM. После этого можно создавать пользователей, группы и разрешения, а также управлять ими с помощью API IAM, интерфейса командной строки AWS или консоли IAM, предоставляющей интерактивный веб-интерфейс. Для создания политик можно также использовать визуальный редактор.

Вопрос. Какие задачи решает IAM?
IAM упрощает предоставление безопасного доступа множества пользователей к вашим ресурсам AWS. IAM предоставляет приведенные ниже возможности.

  • Управление пользователями IAM и их правами доступа. Можно создавать пользователей в системе управления удостоверениями AWS, назначать им индивидуальные данные для доступа (такие как ключи доступа, пароли, устройства многофакторной аутентификации) или запрашивать временные данные для доступа пользователей к сервисам и ресурсам AWS. Можно предоставлять разрешения для контроля за операциями, выполняемыми пользователями.
  • Управление доступом для федеративных пользователей. Для пользователей, которыми вы управляете в корпоративном каталоге, можно запрашивать данные, подтверждающие права доступа и имеющие ограниченный срок действия. Это позволит предоставлять сотрудникам и приложениям безопасный доступ к вашему аккаунту AWS без создания для них отдельных аккаунтов пользователей IAM. Для таких данных можно назначать разрешения для контроля за операциями, выполняемыми пользователями.

Вопрос. Кто может использовать IAM?
Любой клиент AWS может использовать IAM. Дополнительная плата за пользование этим сервисом не взимается. Плата взимается только за использование созданными пользователями других сервисов AWS.

Вопрос. Кто или что понимается под пользователем?
Пользователю присваивается уникальное удостоверение, распознаваемое сервисами и приложениями AWS. Как и в операционных системах типа Windows или UNIX, пользователь имеет уникальное имя и может идентифицироваться с помощью привычных данных, подтверждающих права доступа, таких как пароль или ключ доступа. В роли пользователя может выступать частное лицо, система или приложение, которым требуется доступ к сервисам AWS. IAM поддерживает пользователей (далее «пользователи IAM»), контролируемых через систему управления удостоверениями AWS. С помощью IAM вы также можете предоставлять доступ к ресурсам AWS тем пользователям, управление которыми в корпоративном каталоге осуществляется не системой AWS (далее «федеративные пользователи»).

Вопрос. Какие действия может выполнять пользователь?
Пользователь может отправлять запросы в веб-сервисы, такие как Amazon S3 и Amazon EC2. Возможность доступа пользователя к API веб-сервисов находится под контролем и в зоне ответственности аккаунта AWS, в рамках которого определен пользователь. Можно разрешить пользователю доступ к некоторым или всем сервисам AWS, которые интегрированы с IAM и на которые подписан аккаунт AWS. При наличии соответствующего разрешения пользователь получает доступ ко всем ресурсам в рамках аккаунта AWS. Кроме того, если аккаунт AWS имеет доступ к ресурсам другого аккаунта AWS, то связанные с ним пользователи могут получить доступ к данным обоих аккаунтов AWS. Любые ресурсы в AWS, создаваемые пользователем, находятся под контролем соответствующего аккаунта AWS и оплачиваются со счета этого аккаунта. Пользователь не может отдельно подписаться на сервисы AWS либо управлять ресурсами.

Вопрос. Как пользователи могут вызывать сервисы AWS?
Пользователи могут выполнять запросы к сервисам AWS, используя данные, подтверждающие права доступа. Возможность обращения пользователей к сервисам AWS регулируется с помощью явных разрешений. По умолчанию пользователи не могут вызывать API сервисов от имени аккаунта.

Вопрос. Как начать использовать IAM?
Чтобы начать использовать IAM, необходимо подписаться хотя бы на один сервис AWS, который интегрирован с IAM. После этого можно создавать пользователей, группы и разрешения, а также управлять ими с помощью API IAM, интерфейса командной строки AWS или консоли IAM, предоставляющей интерактивный веб-интерфейс. Для создания политик также можно воспользоваться AWS Policy Generator.

Управление пользователями в IAM

Вопрос. Как осуществляется управление пользователями IAM?
Перечисленные ниже действия можно выполнять в IAM различными способами.

  • Создание пользователей IAM и управление ими.
  • Создание групп IAM и управление ими.
  • Управление данными для доступа пользователей.
  • Создание политик для предоставления доступа к сервисам и ресурсам AWS и управление ими.

Можно создавать пользователей, группы и политики и управлять ими с помощью API IAM, интерфейса командной строки или консоли IAM. Для создания и тестирования политик также можно использовать визуальный редактор и симулятор политик IAM.


Вопрос. Что такое группа?
Группа – это набор пользователей IAM. Управление членством в группе осуществляется с помощью простого списка.

  • Пользователей можно добавлять в группу или удалять из нее.
  • Один пользователь может принадлежать к нескольким группам.
  • Группы не могут принадлежать к другим группам.
  • Группам могут выдаваться разрешения на основании политик управления доступом. Управлять разрешениями для коллекций пользователей удобнее, чем для каждого пользователя по отдельности.
  • Группы не обладают данными, подтверждающими права доступа, и не могут получать доступ к веб-сервисам напрямую; они существуют исключительно для того, чтобы упростить управление разрешениями для пользователей. Дополнительные сведения см. в разделе Working with Groups and Users.

Вопрос. Какими данными, подтверждающими права доступа, могут обладать пользователи IAM?
Пользователи IAM могут обладать данными для доступа в любой комбинации, поддерживаемой AWS. К таким данным относятся, например, ключ доступа AWS, сертификат X.509, ключ SSH, пароль для входа в интернет-приложение или устройство MFA. Это позволяет пользователям взаимодействовать с AWS удобным для них способом. Сотрудник может иметь как ключ доступа AWS, так и пароль; система программного обеспечения может обладать только ключом доступа AWS, позволяющим совершать программные вызовы; пользователи IAM могут иметь частный ключ SSH для доступа к репозиториям AWS CodeCommit; сторонний подрядчик может иметь только сертификат X.509, позволяющий использовать интерфейс командной строки EC2. Дополнительные сведения см. в разделе Безопасные временные данные для доступа документации IAM.

Вопрос. Какие сервисы AWS поддерживают пользователей IAM?
Полный список сервисов AWS с поддержкой пользователей IAM см. в разделе Сервисы AWS, работающие с IAM документации IAM. В AWS в будущем планируется внедрение поддержки других сервисов.

Вопрос. Можно ли активировать и деактивировать пользователей?
Да. Ключи доступа пользователей IAM можно активировать и деактивировать через API IAM, интерфейс командной строки AWS или консоль IAM. Деактивация ключей доступа означает, что пользователь не сможет получить программный доступ к сервисам AWS.

Вопрос. Кто может управлять пользователями в аккаунте AWS?
Владелец аккаунта AWS может управлять пользователями, группами, данными, подтверждающими права доступа, и разрешениями. Кроме того, отдельным пользователям можно разрешить работать с API IAM для управления другими пользователями. Например, для управления корпоративными пользователями рекомендуется создать пользователя-администратора. Пользователь, получивший такое разрешение, может управлять другими пользователями с помощью API IAM, интерфейса командной строки AWS или консоли IAM.

Вопрос. Можно ли упорядочить коллекцию пользователей в виде определенной иерархии, например LDAP?
Да. Пользователей и группы можно организовывать в отдельные ветви, аналогично ветвям объектов в Amazon S3, например /mycompany/division/project/joe.

Вопрос. Можно ли разделять пользователей по регионам?
В настоящее время нет. На сегодняшний день пользователи являются глобальными сущностями, как, например, аккаунт AWS. При определении разрешений пользователя указание региона не требуется. Пользователи могут работать с сервисами AWS в любом географическом регионе.

Вопрос. Как конфигурируются устройства MFA для пользователей IAM?
Владелец аккаунта AWS может заказать множество устройств MFA. Эти устройства можно назначить отдельным пользователям IAM с помощью API IAM, интерфейса командной строки AWS или консоли IAM.

Вопрос. Какой вид ротации ключей поддерживается для пользователей IAM?
Ротация пользовательских ключей доступа и сертификатов X.509 выполняется точно так же, как для идентификаторов доступа аккаунта AWS с правами root. Программное управление пользовательскими ключами доступа и сертификатами X.509, а также их ротация реализуются через API IAM, интерфейс командной строки AWS или консоль IAM.

Вопрос. Могут ли пользователи IAM иметь персональные SSH-ключи EC2?
В первоначальной версии такая возможность отсутствует. IAM не касается SSH-ключей EC2 или сертификатов Windows RDP. Это означает, что хотя у каждого пользователя есть данные для доступа к API веб-сервиса, у них также должны быть SSH-ключи, общие для пользователей аккаунта AWS, к которому они относятся.

Вопрос. Где можно использовать ключи SSH?

В настоящее время пользователи IAM могут использовать свои ключи SSH только при работе с AWS CodeCommit для доступа к своим репозиториям.

Вопрос. Должны ли использоваться адреса электронной почты в качестве имен пользователей IAM?
Не обязательно, но могут. Имена пользователей представляют собой просто строки ASCII, уникальные для определенного аккаунта AWS. При назначении имен пользователей вы можете руководствоваться любыми принципами присваивания имен пользователей, используя в том числе и адреса электронной почты.

Вопрос. Какую кодировку необходимо использовать для имен пользователей IAM?
Сущности IAM поддерживают только кодировку ASCII.

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

Вопрос. Как устанавливать пользовательские пароли?
Первоначально пароль для пользователя IAM можно установить с помощью консоли IAM, интерфейса командной строки AWS или API IAM. После первичной инициализации пароли более никогда не отображаются в виде незашифрованного текста, а также не отображаются и не возвращаются при вызове через API. Пользователи IAM могут управлять собственными паролями на странице My Password в Консоли IAM. Чтобы перейти на эту страницу, необходимо выбрать параметр Security Credentials в раскрывающемся меню Консоли управления AWS, расположенном в правом верхнем углу экрана.

Вопрос. Можно ли определить политику паролей для пользователей?
Да, можно принудительно обеспечить создание сложных паролей, например установить минимальную длину пароля или требовать присутствия в нем хотя бы одной цифры. Можно также задать автоматическое истечение срока действия пароля, запретить повторное использование старых паролей и запрашивать сброс пароля при следующем входе в AWS. Дополнительные сведения см. в разделе Setting an Account Policy Password for IAM Users.

Вопрос. Можно ли устанавливать квоты на использование для пользователей IAM?
Нет. Все ограничения накладываются на аккаунт AWS в целом. Например, если для вашего аккаунта AWS установлено ограничение в 20 инстансов Amazon EC2, то пользователи IAM с разрешениями EC2 могут запускать инстансы в пределах этого ограничения. Ограничить действия определенного пользователя невозможно.

Управление ролями в IAM

Вопрос. Что такое роль в IAM?
Роль – это сущность IAM, которая определяет набор разрешений для выполнения запросов к сервисам AWS. Роли IAM не связываются с конкретным пользователем или группой. Вместо этого роли присваиваются доверенным сущностям, например пользователям IAM, приложениям или сервисам AWS, таким как EC2.

Вопрос. Какие задачи решают роли в IAM?
Роли в IAM позволяют делегировать доступ с определенными разрешениями доверенным сущностям без необходимости делиться ключами доступа длительного действия. Роли IAM можно использовать для делегирования доступа пользователям IAM, управляемым вашим аккаунтом, пользователям IAM, связанным с другим аккаунтом AWS, или сервису AWS, например EC2.

Вопрос. Как начать использовать роли в IAM?
Процесс создания роли аналогичен процессу создания пользователя – необходимо дать роли имя и прикрепить к ней политику. Дополнительные сведения см. в разделе Creating IAM Roles.

Вопрос. Как присвоить себе роль в IAM?
Роль в IAM можно присвоить путем вызова API AssumeRole сервиса AWS Security Token Service (STS) (другими словами, AssumeRole, AssumeRoleWithWebIdentity и AssumeRoleWithSAML). Эти API возвращают пакет временных данных, подтверждающих права доступа. Приложения могут затем использовать эти данные для подписи запросов к API сервисов AWS.

Вопрос. Сколько ролей в IAM разрешается себе присвоить?
Какое-либо ограничение по количеству присваиваемых ролей в IAM отсутствует. Однако при создании запросов к сервисам AWS можно единовременно использовать только одну роль.

Вопрос. Кто может использовать роли в IAM?
Любой клиент AWS может использовать роли IAM.

Вопрос. Сколько стоят роли в IAM?
Роли в IAM бесплатны. Вы продолжите платить за ресурсы, которые использует роль в вашем аккаунте AWS.

Вопрос. Как управлять ролями в IAM?
Роли в IAM можно создавать и управлять ими с помощью API IAM, интерфейса командной строки AWS или Консоли IAM, предоставляющей интерактивный веб-интерфейс.

Вопрос. В чем разница между ролью в IAM и пользователем IAM?
Пользователь IAM имеет постоянные данные, подтверждающие права доступа, с длительным сроком действия и используется для взаимодействия с сервисами AWS напрямую. Роль в IAM не имеет каких-либо данных, подтверждающих права доступа, и не может выполнять запросы к сервисам AWS напрямую. Роли IAM предназначены для присвоения сущностям, имеющим соответствующие права, таким как пользователи IAM, приложения или сервисы AWS, например EC2.

Вопрос. Когда следует использовать пользователя IAM, а когда – группу или роль IAM?

Пользователь IAM имеет постоянные данные, подтверждающие права доступа, с длительным сроком действия и используется для взаимодействия с сервисами AWS напрямую. Группа в IAM предназначена прежде всего для удобства управления, позволяя управлять одинаковыми наборами разрешений для наборов пользователей IAM. Роль в IAM – это сущность в AWS Identity and Access Management (IAM) с разрешениями на выполнение запросов к сервисам AWS. Роли IAM не могут выполнять запросы к сервисам AWS напрямую; роли присваиваются сущностям, имеющим соответствующие права, таким как пользователи IAM, приложения или сервисы AWS, например EC2. Роли IAM используются для делегирования доступа внутри аккаунта AWS или между аккаунтами.

Вопрос. Можно ли добавить роль IAM группе IAM?
В настоящий момент нет.

Вопрос. Сколько политик можно прикрепить к роли IAM?

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

  • Размер политики для пользователей не может превышать 2048 символов.
  • Размер политики ролей не может превышать 10 240 символов.
  • Размер групповой политики не может превышать 5120 символов.

Для управляемых политик: для пользователя, роли или группы можно добавлять до 10 управляемых политик. Размер каждой управляемой политики не может превышать 6144 символов.

Вопрос. Сколько ролей IAM разрешается создавать?
В рамках одного аккаунта AWS можно создавать не более 1000 ролей IAM. Если требуется больше ролей, следует отправить запрос на увеличение лимита IAM с помощью данной формы и описать свой пример использования. Запрос будет рассмотрен.

Вопрос. К каким сервисам мое приложение может отправлять запросы?
Ваше приложение может выполнять запросы к любым сервисам AWS, которые поддерживают ролевые сеансы.

Вопрос. Что представляют собой роли в IAM для инстансов EC2?
Роли в IAM для инстансов EC2 позволяют приложениям, запущенным в EC2, выполнять запросы к таким сервисам AWS, как Amazon S3, Amazon SQS и Amazon SNS, без необходимости копирования ключей доступа AWS для каждого инстанса. Подробнее см. в разделе Роли IAM для Amazon EC2.

Вопрос. Каковы возможности ролей в IAM для инстансов EC2?

Роли в IAM предоставляют приведенные ниже возможности для инстансов EC2.

  • Временные данные, подтверждающие права доступа к AWS, для использования при создании запросов от запущенных инстансов EC2 к сервисам AWS.
  • Автоматическая ротация временных данных, подтверждающих права доступа к AWS.
  • Детальные разрешения сервисов AWS для приложений, запущенных в инстансах EC2.

Вопрос. Какую задачу решают роли в IAM для инстансов EC2?
Роли в IAM для инстансов EC2 упрощают развертывание ключей доступа AWS для инстансов EC2 и управление ими. Используя данную возможность, можно связать роль в IAM с инстансом. Затем ваш инстанс EC2 предоставит приложениям, запущенным в инстансе, временные данные для доступа. Приложения смогут использовать эти данные для безопасного выполнения запросов к ресурсам сервиса AWS, определенным в роли.

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

Вопрос. Можно ли использовать одну и ту же роль в IAM для нескольких инстансов EC2?
Да.

Вопрос. Можно ли изменить роль в IAM для запущенного инстанса EC2?
Да. Обычно роль инстанса EC2 назначается при запуске, но можно назначить роль и для уже работающего инстанса EC2. Узнать, как назначить роль для работающего инстанса, можно в разделе Роли IAM для Amazon EC2. Можно также изменить разрешения для роли IAM, связанной с работающим инстансом. Обновленные разрешения вступят в действие практически немедленно.

Вопрос. Можно ли связать роль IAM с уже работающим инстансом EC2?
Да. Для уже работающего инстанса EC2 можно назначить новую роль. Узнать, как назначить роль для уже работающего инстанса, можно в разделе Роли IAM для Amazon EC2.

Вопрос. Можно ли связать роль в IAM с группой Auto Scaling?

Да. Роль в IAM можно добавить в качестве дополнительного параметра в конфигурацию запуска Auto Scaling, а затем создать группу Auto Scaling с этой конфигурацией запуска. Для всех инстансов EC2, запущенных в группе Auto Scaling, которая связана с ролью IAM, эта роль будет передана при запуске как входной параметр. Подробнее см. в разделе Что такое Auto Scaling? Руководства для разработчиков по Auto Scaling.

Вопрос. Можно ли связать более одной роли с инстансом EC2?
Нет. В настоящее время с инстансом EC2 можно связать только одну роль. Лимит в одну роль для инстанса увеличить невозможно.

Вопрос. Что будет, если удалить роль IAM, назначенную для работающего инстанса EC2?
Доступ будет немедленно запрещен любому приложению, запущенному в инстансе, который использует эту роль.

Вопрос. Можно ли контролировать то, какие роли в IAM пользователь IAM может связывать с инстансом EC2?
Да. Подробнее см. в разделе Разрешения, необходимые для использования ролей при работе с Amazon EC2.

Вопрос. Какие разрешения требуются для запуска инстансов EC2 с ролью IAM?
Для успешного запуска инстансов EC2 с ролями пользователь IAM должен обладать двумя различными разрешениями:

  • разрешением на запуск инстансов EC2;
  • разрешением на связь ролей в IAM с инстансами EC2.

Вопрос. Кто может получать доступ к ключам доступа в инстансе EC2?
Любой локальный пользователь инстанса может получить доступ к ключам доступа, связанным с ролью в IAM.

Вопрос. Как использовать роль в IAM для приложения в инстансе EC2?
Если приложение разрабатывается с использованием SDK AWS, то SDK AWS автоматически использует ключи доступа AWS, ставшие доступными в инстансе EC2. Если SDK AWS не используется, то запросить ключи доступа можно в EC2 Instance Metadata Service. Подробнее см. в разделе Использование ролей IAM для предоставления доступа приложениям, выполняющимся в инстансах Amazon EC2.

Вопрос. Как обеспечить ротацию временных данных, подтверждающих права доступа к инстансу EC2?
Для временных данных, связанных с ролью в IAM и подтверждающих права доступа к AWS, ротация происходит автоматически несколько раз в день. Новые временные данные, подтверждающие права доступа, становятся доступными не позднее чем за пять минут до конца срока действия существующих временных данных.

Вопрос. Роли IAM для инстансов EC2 можно использовать с любыми типами инстансов или AMI?
Да. Роли в IAM для инстансов EC2 также работают в Amazon Virtual Private Cloud (VPC), со спотовыми и зарезервированными инстансами.

Вопрос. Что такое связанная с сервисом роль?
Связанная с сервисом роль – это тип роли, которая связывается с сервисом AWS (также известным как связанный сервис), при этом только этот связанный сервис может принимать на себя данную роль. С помощью таких ролей можно делегировать разрешения сервисам AWS для создания ресурсов AWS и управления ими от имени пользователя.

Вопрос. Можно ли брать на себя связанную с сервисом роль?
Нет. Связанную с сервисом роль может брать на себя только конкретный связанный сервис. Именно по этой причине для связанной с сервисом роли нельзя изменить политику доверия.

Вопрос. Можно ли удалить связанную с сервисом роль?
Да. Если больше не требуется, чтобы сервис AWS выполнял действия от вашего имени, можно удалить связанную с сервисом роль. Перед удалением роли необходимо удалить все ресурсы AWS, связанные с этой ролью. Этот шаг защищает от случайного удаления роли, необходимой для правильной работы ресурсов AWS.

Вопрос. Как можно удалить связанную с сервисом роль?
Связанную с сервисом роль можно удалить из консоли IAM. Выберите Roles на навигационной панели, выберите связанную с сервисом роль, которую вы хотите удалить, и нажмите Delete role. (Примечание: при работе с Amazon Lex для удаления связанной с сервисом роли нужно использовать консоль Amazon Lex.)

Разрешения

Вопрос. Как работают разрешения?

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

Вопрос. Как назначить разрешения с помощью политики?

Для назначения разрешений можно создать и назначить политики с помощью Консоли управления AWS, API IAM или интерфейса командной строки AWS. Пользователи, которым были предоставлены необходимые разрешения, могут создавать политики и назначать их пользователям, группам и ролям IAM.

Вопрос. Что такое управляемые политики?

Управляемые политики – это ресурсы IAM, устанавливающие разрешения с помощью языка политик IAM. Они могут создаваться, редактироваться и управляться отдельно от пользователей, групп и ролей IAM, с которыми они связаны. Управляемую политику можно связать с несколькими пользователями, группами или ролями IAM. После этого ее можно обновлять централизованно, и разрешения будут автоматически применены ко всем сущностям, с которыми связана эта политика. Управляемые политики управляются вами (политики, управляемые клиентом) или AWS (политики, управляемые AWS). Дополнительные сведения об управляемых политиках см. в разделе Managed Policies and Inline Policies.

Вопрос. Как создать политику, управляемую клиентом?

Можно воспользоваться визуальным редактором или редактором JSON в консоли IAM. Визуальный редактор представляет собой интерактивный редактор, управляемый мышью, который проводит пользователя через процесс создания политики предоставления разрешений, не требуя написания политики в формате JSON. Можно создавать политики и в формате JSON с помощью интерфейса командной строки и SDK.

Вопрос. Как назначить общеупотребительные разрешения?

Сервис AWS предоставляет набор общеупотребительных разрешений, которые можно закрепить за пользователями, группами и ролям IAM в аккаунте. Эти разрешения называются политиками, управляемыми AWS. В качестве примера можно привести доступ только для чтения к Amazon S3. Когда AWS обновляет эти политики, разрешения автоматически применяются к пользователям, группам и ролям, за которыми политика закреплена. Политики, управляемые AWS, автоматически отображаются в разделе Policies консоли IAM. При назначении разрешения можно использовать политику, управляемую AWS, или создать управляемую пользовательскую политику. Создайте новую политику на основе существующей политики, управляемой AWS, или определите свою собственную политику.

Вопрос. Как работают разрешения на основе групп?

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

Вопрос. В чем отличие между назначением разрешений с помощью групп IAM и назначением разрешений с помощью управляемых политик?

Группы IAM используются для объединения пользователей IAM и определения общих разрешений для этих пользователей. Управляемые политики используются для совместного использования разрешений пользователями, группами и ролями IAM. К примеру, если вы желаете, чтобы группа пользователей могла запускать инстанс Amazon EC2, а также чтобы роль в этом инстансе имела одинаковые с пользователями в группе разрешения, то вы можете создать управляемую политику и назначить ее группе пользователей и роли в этом инстансе Amazon EC2.

Вопрос. Как анализируются политики IAM в сочетании с политиками Amazon S3, Amazon SQS, Amazon SNS и AWS KMS на основе ресурсов?

Политики IAM анализируются вместе с политиками сервиса, основанными на ресурсах. Когда политика любого типа предоставляет доступ (без явного отказа), действие разрешается. Подробнее о логике анализа политик см. в разделе IAM Policy Evaluation Logic.

Вопрос. Можно ли использовать управляемую политику как политику на основе ресурсов?

Управляемые политики могут быть назначены только пользователям, группам или ролям IAM. Их нельзя использовать как политики на основе ресурсов.

Вопрос. Как назначить детализированные разрешения, используя политики?

Используя политики, можно указать несколько уровней детализации разрешений. Во-первых, можно определить конкретные сервисные операции AWS, доступ к которым вы хотите разрешить или явным образом запретить. Во-вторых, в зависимости от операции, можно определить конкретные ресурсы AWS, на которых будут выполняться эти операции. В-третьих, можно определить условия, в зависимости от которых политика будет иметь силу (например, включена MFA или нет).

Вопрос. Как проще всего удалить ненужные разрешения?

Чтобы было легче определить, какие разрешения нужны, консоль IAM в настоящее время отображает данные о последнем доступе к сервису, показывающие время последнего доступа сущности IAM (пользователя, группы или роли) к сервису AWS. Информация о том, когда сущность IAM в последний раз использовала разрешение и использовала ли вообще, может помочь удалить ненужные разрешения и ужесточить политики IAM с наименьшими трудозатратами.

Вопрос. Могу ли я предоставлять разрешения на доступ к сведениям уровня аккаунта или на их изменение (например, средство оплаты, контактный адрес электронной почты и журнал оплаты)?

Да. Вы можете делегировать возможность просмотра данных об оплате AWS и изменения сведений аккаунта AWS пользователю IAM или федеративному пользователю. Подробнее об управлении доступом к сведениям об оплате см. в разделе Управление доступом.

Вопрос. Кто может создавать ключи доступа к аккаунту AWS и управлять ими?

Только владелец аккаунта AWS может управлять ключами доступа для аккаунта root. Владелец аккаунта и пользователи или роли IAM, которым были предоставлены необходимые разрешения, могут управлять ключами доступа для пользователей IAM.

Вопрос. Могу ли я предоставить разрешение на доступ к ресурсам AWS, принадлежащим другому аккаунту AWS?
Да. С помощью ролей IAM пользователи IAM и федеративные пользователи могут получать доступ к ресурсам в другом аккаунте AWS через Консоль управления AWS, интерфейс командной строки AWS или API AWS. Дополнительные сведения см. в разделе Управление ролями IAM.

Вопрос. Как выглядит политика?

Приведенная ниже политика предоставляет доступ к операциям добавления, изменения и удаления объектов из конкретной папки с именем example_folder, в конкретной корзине с именем example_bucket.

<
«Version»:»2012-10-17″,
«Statement»:[
<
«Effect»:»Allow»,
«Action»:[
«s3:PutObject»,
«s3:GetObject»,
«s3:GetObjectVersion»,
«s3:DeleteObject»,
«s3:DeleteObjectVersion»
],
«Resource»:»arn:aws:s3. example_bucket/example_folder/*»
>
]
>

Вопрос. Что такое сводная информация о политике?

Если в консоли IAM выбрать политику, то вы увидите сводную информацию о политике. В сводной информации о политике перечислены уровень доступа, ресурсы и условия для каждого сервиса, определенного в политике (см. пример на приведенных ниже снимках экрана). Уровень доступа (просмотр, чтение, запись или управление разрешениями) определяется по действиям, разрешенным политикой для каждого сервиса. Политику можно просматривать в формате JSON, воспользовавшись кнопкой JSON.

Симулятор политик

Вопрос. Что такое симулятор политик IAM?
Симулятор политики IAM – это инструмент, позволяющий понять, проверить и оценить эффективность политик управления доступом.

Вопрос. Для чего можно использовать симулятор политик?
Симулятор политик можно использовать несколькими способами. Можно проверять изменения политик перед тем, как передать их в работу, чтобы убедиться, что они работают так, как нужно. Можно проводить оценку существующих политик, назначенных пользователям, группам и ролям, чтобы проверить разрешения и решить связанные с ними проблемы. Можно также использовать симулятор политик для того, чтобы разобраться, как политики IAM и политики на основании ресурсов работают совместно и предоставляют или отклоняют доступ к ресурсам AWS.

Вопрос. Кто может использовать симулятор политик?
Симулятор политик доступен для всех клиентов AWS.

Вопрос. Сколько стоит симулятор политик?
Симулятор политик предоставляется без дополнительной оплаты.

Вопрос. Как начать работу с сервисом?
Перейдите на страницу https://policysim.aws.amazon.com или нажмите ссылку в консоли IAM в разделе Additional Information. Определите новую политику или выберите существующий набор политик, назначенный пользователю, группе или роли, для оценки. Затем выберите набор действий в списке сервисов AWS, введите всю информацию, требуемую для имитации запроса доступа, запустите имитационное моделирование и определите, разрешает или запрещает политика доступ к выбранным действиям и ресурсам. Чтобы узнать больше о симуляторе политик IAM, просмотрите видео по началу работы или ознакомьтесь с документацией.

Вопрос. Какие виды политик поддерживает симулятор политик IAM?
Симулятор политик поддерживает проверку новых и существующих политик, закрепленных за пользователями, группами или ролями. Кроме того, вы можете проверять предоставление политиками уровня ресурсов доступа к определенному ресурсу для корзин Amazon S3, хранилищ Amazon Glacier, тем Amazon SNS и очередей Amazon SQS. Эта проверка включена в моделирование с указанием имени ресурса Amazon (ARN) в поле Resource в параметрах симуляции сервиса, который поддерживает политики ресурсов.

Вопрос. Если внести изменения в политику в симуляторе, будут ли они применены к политике, развернутой в производственной среде?
Нет. Чтобы применить изменения в производственной среде, скопируйте политику, которую вы изменили в симуляторе, и закрепите ее за необходимым пользователем, группой или ролью IAM.

Вопрос. Можно ли использовать симулятор программным способом?
Да. Симулятор политик можно использовать не только в консоли, но и с помощью AWS SDK или интерфейса командной строки AWS. Используйте вызов API iam:SimulatePrincipalPolicy, чтобы проверить существующие политики IAM программным способом. Чтобы проверить работу новых или обновленных политик, еще не назначенных пользователям, группам или ролям, используйте вызов API iam:SimulateCustomPolicy.

Вопрос. Как пользователю IAM войти в систему?

Для входа в консоль управления AWS в качестве пользователя IAM, помимо своего имени пользователя и пароля, необходимо предоставить ID или псевдоним аккаунта. При создании аккаунта пользователя IAM в консоли администратор должен предоставить вам ваше зарегистрированное имя пользователя и ссылку на страницу аутентификации. Данная ссылка включает в себя ID или псевдоним вашего аккаунта.

Можно также войти, используя следующий адрес, дописав к нему ID или псевдоним вашего аккаунта вручную:

Для удобства пользователей страница аутентификации AWS использует cookie-файлы браузера, чтобы запомнить имя пользователя IAM и данные его аккаунта. При следующем переходе пользователя на любую страницу Консоли управления AWS Консоль использует сохраненные данные cookie-файла, чтобы перенаправить пользователя на страницу аутентификации.

Примечание. Пользователи IAM по-прежнему могут использовать для входа в Консоль управления AWS ссылку, предоставленную им администратором.

Вопрос. Что такое псевдоним аккаунта AWS?

Псевдоним аккаунта – это имя, которое вы определяете, чтобы сделать его более удобным для идентификации аккаунта. Псевдоним можно создать с помощью API IAM, инструментов командной строки или консоли IAM. У вас может быть один псевдоним на каждый аккаунт AWS.

Вопрос. К каким сайтам AWS могут получать доступ пользователи IAM?

Пользователи IAM могут выполнять вход на перечисленные ниже сайты AWS.

Вопрос. Могут ли пользователи IAM выполнять вход на другие ресурсы Amazon.com с помощью своих данных для доступа?
Нет. Пользователи, созданные с помощью IAM, распознаются только сервисами и приложениями AWS.

Вопрос. Существует ли API аутентификации, предназначенный для проверки данных пользователей IAM, используемых для входа?
Нет. Программного способа проверки данных, используемых пользователями для входа, не существует.

Вопрос. Могут ли пользователи получать SSH-доступ к инстансам EC2, используя свое имя пользователя и пароль в AWS?
Нет. Созданные с помощью IAM данные, подтверждающие права доступа пользователей, не поддерживаются для непосредственной аутентификации в клиентских инстансах EC2. Управление SSH-данными, подтверждающими права доступа в EC2, должно осуществляться клиентом в Консоли EC2.

Временные данные, подтверждающие права доступа

Вопрос. Что представляют собой временные данные, подтверждающие права доступа?
Временные данные для доступа включают идентификатор ключа доступа AWS, секретный ключ доступа и токен безопасности. Временные данные, подтверждающие права доступа, действуют в течение определенного периода времени и для определенного набора разрешений. Временные данные, подтверждающие права доступа, иногда просто называются токенами. Вы можете отправить запрос на токены для пользователей IAM или федеративных пользователей, которыми управляете в своем корпоративном каталоге. Подробнее см. в разделе Распространенные сценарии для временных данных для доступа.

Вопрос. Каковы преимущества временных данных, подтверждающих права доступа?
Временные данные, подтверждающие права доступа, позволяют выполнять перечисленные ниже задачи.

  • Расширять каталоги внутренних пользователей для обеспечения федерации с AWS, позволяющей сотрудникам и приложениям получать безопасный доступ к API сервиса AWS без создания удостоверения AWS.
  • Отправлять запросы на временные данные, подтверждающие права доступа, для неограниченного количества федеративных пользователей.
  • Настраивать период времени, после которого истекает срок действия временных данных, подтверждающих права доступа, для повышения безопасности при получении доступа к API сервиса AWS с мобильных устройств, когда существует риск потери устройства.

Вопрос. Как отправить запрос на временные данные, подтверждающие права доступа, для федеративных пользователей?
Можно сделать это с помощью вызовов API GetFederationToken, AssumeRole, AssumeRoleWithSAML или AssumeRoleWithWebIdentity сервиса STS.

Вопрос. Как пользователи IAM могут отправить запрос на временные данные, подтверждающие права доступа, для личного пользования?
Пользователи IAM могут отправить запрос на временные данные, подтверждающие права доступа, для личного пользования, вызвав API GetSessionToken сервиса AWS STS. По умолчанию срок действия этих временных данных для доступа составляет 12 часов. Минимальный срок действия – 15 минут, максимальный – 36 часов.

Временные данные для доступа можно также использовать с защищенным с помощью Multi-Factor Authentication (MFA) доступом к API.

Вопрос. Как использовать временные данные для доступа для вызова API сервиса AWS?
Если вы делаете прямые запросы API к AWS по протоколу HTTPS, их можно подписывать с помощью временных данных для доступа, которые вы получили от AWS Security Token Service (AWS STS). Для этого выполните следующие действия.

  • Используйте для подписи запроса идентификатор ключа доступа и секретный ключ доступа, предоставляемые вместе с временными данными для доступа, точно так же, как вы бы использовали долгосрочные данные для доступа. Подробнее о подписи запросов API по HTTPS см. в разделе Подпись запросов API к AWS в общих справочных материалах по AWS.
  • Используйте токен сеанса, предоставляемый вместе с временными данными для доступа. Включите токен сеанса в заголовок x-amz-security-token. См. образец запроса ниже.
    • Для сервиса Amazon S3: с помощью заголовка HTTP x-amz- security-token.
    • Для других сервисов AWS: с помощью параметра SecurityToken.

Вопрос. Какие сервисы AWS принимают временные данные для доступа?
Список поддерживаемых сервисов см. на странице Сервисы AWS, работающие с IAM.

Вопрос. Каков максимальный размер политики доступа, который можно указать при отправке запроса на временные данные для доступа (GetFederationToken или AssumeRole)?
Незашифрованный текст политики должен быть длиной не более 2048 байт. Однако после конвертации во внутренний упакованный двоичный формат предельный размер будет другим.

Вопрос. Можно ли отозвать временные данные, подтверждающие права доступа, до истечения срока их действия?
Нет. При отправке запроса на временные данные для доступа мы рекомендуем выполнить перечисленные ниже действия.

  • Во время создания временных данных, подтверждающих права доступа, установите срок действия, подходящий для вашего приложения.
  • Поскольку невозможно ограничить разрешения аккаунта root, для создания временных данных, подтверждающих права доступа, используйте пользователя IAM, а не корневой root. Вы можете отозвать разрешения пользователя IAM, который издал исходный вызов для отправки запроса на временные данные. Это действие приведет к почти мгновенному отзыву прав для всех временных данных для доступа, изданных этим пользователем IAM.

Вопрос. Можно ли повторно активировать временные данные для доступа или продлить срок их действия?
Нет. Рекомендуется регулярно проверять срок действия данных, подтверждающих права доступа, и отправлять запрос на новые данные до истечения срока действия старых. Этот процесс ротации управляется автоматически, когда временные данные, подтверждающие права доступа, используются в ролях для инстансов EC2.

Вопрос. Во всех ли регионах поддерживаются временные данные, подтверждающие права доступа?
Клиенты могут отправлять запросы на токены в конечные точки AWS STS во всех регионах, включая регионы AWS GovCloud (США) и Китай (Пекин). Временные данные, подтверждающие права доступа, из AWS GovCloud (США) и Китая (Пекин) можно использовать только в регионе происхождения. Временные данные для доступа, запросы на которые были отправлены из других регионов, таких как, например, Восток США (Северная Вирджиния) или ЕС (Ирландия), могут использоваться во всех регионах, кроме AWS GovCloud (США) и Китая (Пекин).

Вопрос. Можно ли ограничить использование временных данных, подтверждающих права доступа, одним регионом или некоторыми регионами?

Нет. Вы не можете ограничить использование временных данных, подтверждающих права доступа, определенным регионом или подмножеством регионов, кроме временных данных, подтверждающих права доступа, из регионов AWS GovCloud (США) и Китая (Пекин), которые могут использоваться только в соответствующих регионах происхождения.

Вопрос. Что необходимо сделать, чтобы начать использовать конечную точку AWS STS?

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

Вопрос. Что произойдет, если начать использовать региональный адрес сервера AWS STS, который был деактивирован для моего аккаунта AWS?

При попытке использования регионального адреса сервера AWS STS, который был деактивирован для вашего аккаунта AWS, сервис AWS STS отобразит исключение AccessDenied со следующим сообщением: «AWS STS не активирован в этом регионе для аккаунта ID аккаунта. Ваш администратор аккаунтов может активировать сервис AWS STS в этом регионе с помощью Консоли IAM».

Вопрос. Какие требуются разрешения, чтобы активировать или деактивировать регионы AWS STS на странице настроек аккаунта?

Только пользователи, имеющие разрешения уровня не ниже iam:*, могут активировать или деактивировать регионы AWS STS на странице настроек аккаунта консоли IAM. Обратите внимание, что конечные точки AWS STS в таких регионах, как Восток США (Северная Вирджиния), AWS GovCloud (США) и Китай (Пекин), всегда активны и их нельзя деактивировать.

Вопрос. Можно ли использовать API или CLI, чтобы активировать или деактивировать регионы AWS STS?

Нет. В настоящее время отсутствует поддержка API или CLI, чтобы активировать или деактивировать регионы AWS STS. Мы планируем обеспечить поддержку API и CLI в следующем выпуске.


Федерация удостоверений

Вопрос. Что такое федерация удостоверений?
AWS Identity and Access Management (IAM)поддерживает федерацию удостоверений для делегированного доступа к Консоли управления AWS или API AWS. При использовании федерации удостоверений внешним удостоверениям предоставляется безопасный доступ к ресурсам вашего аккаунта AWS без необходимости создавать пользователей IAM. Эти внешние удостоверения могут поступать от вашего поставщика корпоративных удостоверений (например, от Microsoft Active Directory или AWS Directory Service) или от поставщика сетевых удостоверений (например, Amazon Cognito, Login with Amazon, Facebook, Google или любого поставщика, совместимого с OpenID Connect).

Вопрос. Кто такие «федеративные пользователи»?
Федеративные пользователи (пользователи с внешними удостоверениями) – это пользователи, управление которыми осуществляется за пределами AWS в вашем корпоративном каталоге и которым предоставлен доступ к вашему аккаунту AWS с помощью временных данных для доступа. Они отличаются от пользователей IAM, которых можно создать и управлять ими в вашем аккаунте AWS.

Вопрос. Предоставляется ли поддержка SAML?
Да. Сервис AWS поддерживает SAML (Security Assertion Markup Language) 2.0.

Вопрос. Какие профили SAML поддерживает сервис AWS?
Конечная точка единого входа (SSO) AWS поддерживает профиль WebSSO SAML с использованием запроса HTTP-POST, инициированного поставщиком удостоверений. Это позволяет федеративному пользователю выполнять вход в Консоль управления AWS с помощью утверждения SAML. Утверждение SAML можно также использовать для отправки запроса на временные данные для доступа с помощью API AssumeRoleWithSAML. Подробнее см. в разделе Федерации на основе SAML 2.0.

Вопрос. Могут ли федеративные пользователи получать доступ к API сервиса AWS?
Да. Вы можете программно отправить запрос на временные данные, подтверждающие права доступа, для своих федеративных пользователей, чтобы предоставить им безопасный и прямой доступ к API сервиса AWS. Мы предлагаем образец приложения, демонстрирующий, как можно обеспечить федерацию удостоверений. При этом пользователям, управляемым с помощью Microsoft Active Directory, предоставляется доступ к API сервиса AWS. Дополнительные сведения см. в разделе Использование безопасных данных доступа для запроса доступа к ресурсам AWS.

Вопрос. Могут ли федеративные пользователи получать доступ к Консоли управления AWS?
Да. Для этого существует несколько способов. Один из них – программно отправить запрос на получение временных данных для доступа (например, с помощью команды GetFederationToken или AssumeRole), для своих федеративных пользователей и включить эти данные в запрос на вход в Консоль управления AWS. После аутентификации пользователя и предоставления ему временных данных, подтверждающих права доступа, вы создаете токен входа для однократной идентификации (SSO) AWS. Действия пользователя в консоли ограничены политикой управления доступом, которая связана с временными данными, подтверждающими права доступа. Подробнее см. в материале Создание URL-адреса, позволяющего федеративным пользователям получить доступ к Консоли управления AWS (собственное средство управления федерацией).

Можно также опубликовать утверждение SAML непосредственно на странице входа в сервис AWS (https://signin.aws.amazon.com/saml). Действия пользователя в Консоли будут ограничены политикой управления доступом, которая связана с ролью IAM, предполагаемой при использовании утверждения SAML. Подробнее см. в разделе Предоставление федеративным пользователям SAML 2.0 доступа к Консоли управления AWS.

Любой из подходов обеспечит федеративному пользователю доступ к Консоли без необходимости выполнения входа с помощью имени пользователя и пароля. Мы предлагаем образец приложения, чтобы демонстрировать, как можно обеспечить федерацию удостоверений, предоставив доступ к Консоли управления AWS пользователям, управляемым с помощью Microsoft Active Directory.

Вопрос. Как управлять разрешенными действиями для федеративного пользователя после входа в Консоль?
При отправке запроса для федеративного пользователя на временные данные для доступа вы можете включить политику доступа с помощью API AssumeRole. Права федеративного пользователя определены разрешениями, предоставленными в рамках политики доступа, переданной с запросом, и политики доступа, закрепленной за предполагаемой ролью IAM. Политика доступа, переданная с запросом, не может повысить права, связанные с предполагаемой ролью IAM. При отправке запроса на временные данные, подтверждающие права доступа, для федеративного пользователя с помощью API GetFederationToken вы должны включить в запрос политику доступа. Права федеративного пользователя определены разрешениями, предоставленными в рамках политики доступа, переданной с запросом, и политики доступа, закрепленной за пользователем IAM, который использовался для отправки запроса. Политика доступа, переданная с запросом, не может повысить права, связанные с пользователем IAM, который использовался для отправки запроса. Эти разрешения федеративного пользователя применяются как к доступу к API, так и к действиям в Консоли управления AWS.

Вопрос. Какие разрешения необходимы федеративному пользователю, чтобы использовать Консоль?
Пользователю требуются разрешения для API сервиса AWS, вызываемых Консолью управления AWS. Общие разрешения, требуемые для доступа к сервисам AWS, описаны в руководстве Использование безопасных временных данных доступа для запроса доступа к ресурсам AWS.

Вопрос. Как управлять временем доступа федеративного пользователя к Консоли управления AWS?
В зависимости от API, используемого для создания временных данных для доступа, можно указать максимальную продолжительность сеанса от 15 минут до 36 часов (для GetFederationToken и GetSessionToken) и от 15 минут до 12 часов (для API AssumeRole*); федеративный пользователь будет иметь доступ к Консоли в течение указанного времени. По истечении сеанса федеративному пользователю нужно отправить запрос на новый сеанс. Для этого он должен вернуться к своему поставщику удостоверений, и там ему может быть снова предоставлен доступ. Подробнее о настойке продолжительности сеанса.

Вопрос. Что происходит, когда истекает срок действия сеанса Консоли для федерации удостоверений?
Пользователь увидит сообщение о том, что срок действия сеанса Консоли истек и необходимо отправить запрос на новый сеанс. Вы можете указать URL-адрес, чтобы перенаправлять пользователей на веб-страницу вашей локальной сети, на которой они могут отправить запрос на новый сеанс. Этот URL-адрес добавляется в запрос на вход при указании параметра «Издатель». Подробнее см. в разделе Предоставление федеративным пользователям SAML 2.0 доступа к Консоли управления AWS.

Вопрос. Скольким федеративным пользователям можно предоставить доступ к Консоли управления AWS?
Ограничений относительно количества федеративных пользователей, которым может быть предоставлен доступ к Консоли, не предусмотрено.

Вопрос. Что такое федерация сетевых удостоверений?

Федерация сетевых удостоверений позволяет создавать приложения для мобильных устройств с поддержкой AWS, в которых для аутентификации используются поставщики публичных удостоверений (например, Amazon Cognito, Login with Amazon, Facebook, Google или любой другой поставщик, совместимый с OpenID Connect). С помощью федерации сетевых удостоверений можно легко войти в приложения, используя учетные записи поставщиков публичных удостоверений (IdPs). Нет необходимости разрабатывать серверную часть приложения или распространять с ним долгосрочные данные AWS для безопасного доступа.

Дополнительные сведения о федерации сетевых удостоверений и начале работы см. в разделе Федерация сетевых удостоверений.

Вопрос. Как включить федерацию сетевых удостоверений при работе с аккаунтами от поставщиков публичных удостоверений?

Почти для всех сценариев использования федерации сетевых удостоверений лучше всего использовать в качестве средства управления удостоверениями сервис Amazon Cognito. Amazon Cognito прост в использовании и предоставляет дополнительные возможности, такие как анонимный (без аутентификации) доступ и синхронизация данных пользователя по всем устройствам и провайдерам. Тем не менее, если вы уже создали приложение, использующее федерацию сетевых удостоверений посредством ручного вызова AssumeRoleWithWebIdentity API, вы можете продолжать его использование, оно будет работать.

Рассмотрим основные шаги по включению федерации удостоверений с использованием одного из поддерживаемых поставщиков сетевых публичных удостоверений.

  1. Зарегистрируйтесь у поставщика удостоверений как разработчик, получите у него уникальный ID для своего приложения и выполните настройку приложения.
  2. Если вы используете поставщика удостоверений, совместимого с OpenID Connect, создайте для него сущность поставщика удостоверений в IAM.
  3. Создайте одну или более ролей IAM в AWS.
  4. Реализуйте в своем приложении аутентификацию пользователей с помощью поставщика публичных удостоверений.
  5. Создайте в приложении неподписанный вызов API AssumeRoleWithWebidentity для запроса временных данных для доступа.
  6. С помощью временных данных, подтверждающих права доступа, которые вы получили в ответе AssumeRoleWithWebidentity, ваше приложение отправляет подписанные запросы в API сервиса AWS.
  7. Приложение кэширует временные данные, подтверждающие права доступа, чтобы не нужно было получать новые данные каждый раз, когда приложению будет необходимо отправить запрос в сервис AWS.

Вопрос. Чем федерация удостоверений с помощью AWS Directory Service отличается от использования стороннего решения для управления удостоверениями?

Если необходимо, чтобы федеративные пользователи имели только доступ к Консоли управления AWS, использование сервиса AWS Directory Service обеспечивает такие же возможности, как и при использовании стороннего решения для управления удостоверениями. Конечные пользователи смогут входить с помощью своих корпоративных данных для доступа и получать доступ к Консоли управления AWS. Поскольку AWS Directory Service – это автоматизированный сервис, клиентам не требуется настраивать инфраструктуру федерации или управлять ею. Им достаточно создать каталог AD Connector для интеграции с локальным каталогом. Если вы желаете предоставлять федеративным пользователям доступ к API AWS, потребуется использовать предложение стороннего поставщика или развернуть собственный прокси-сервер.

Оплата

Вопрос. Предоставляет ли сервис AWS Billing общий счет за использование и калькуляцию на каждого пользователя?
Нет. В настоящее время эта возможность не поддерживается.

Вопрос. Требуется ли оплата за использование сервиса IAM?
Нет. Это возможность вашего аккаунта AWS, которая предоставляется без дополнительной оплаты.

Вопрос. Кто возмещает расходы за использование пользователями аккаунта AWS?
Владелец аккаунта AWS контролирует все виды использования, данные и ресурсы аккаунта и несет ответственность за них.

Вопрос. Ведется ли учет активности пользователя в данных использования сервиса AWS?
В настоящее время нет. Планируется в будущем выпуске.

Вопрос. Насколько сопоставимы возможности IAM и Consolidated Billing?
IAM и Consolidated Billing – взаимосвязанные возможности. Консолидированная оплата позволяет объединять платежи по нескольким аккаунтам AWS в рамках компании путем назначения одного аккаунта плательщика. Область действия IAM не связана с Consolidated Billing. Пользователь существует в рамках аккаунта AWS и не имеет разрешений в связанных аккаунтах. Подробнее см. в разделе Оплата счетов нескольких аккаунтов с помощью консолидированной оплаты.

Вопрос. Может ли пользователь получать доступ к информации об оплате аккаунтов AWS?
Да, но только если вы это разрешите. Чтобы пользователи IAM получали доступ к информации об оплате, вы должны сначала предоставить доступ к элементам Account Activity и (или) Usage Reports. См. раздел Управление доступом.

Дополнительные вопросы

Вопрос. Что произойдет, если пользователь попытается получить доступ к сервису, который еще не интегрирован в IAM?
Сервис вернет ошибку «Отказано в доступе».

Вопрос. Ведется ли запись действий AWS IAM для целей аудита?
Да. Можно вести журнал действий IAM, действий STS и входов в Консоль управления AWS, активировав AWS CloudTrail. Дополнительные сведения о ведении журналов в AWS см. на странице AWS CloudTrail.

Вопрос. Существует ли какое-то различие между людьми и программными агентами как сущностями AWS?
Нет, обе эти сущности рассматриваются как пользователи с данными, подтверждающими права доступа, и разрешениями. Тем не менее только люди могут использовать пароль в Консоли управления AWS.

Вопрос. Работают ли пользователи с сервисами AWS Support Center и Trusted Advisor?
Да, пользователи IAM имеют возможность создавать и изменять сценарии поддержки, а также использовать Trusted Advisor.

Вопрос. Существуют ли какие-то предельные значения по умолчанию для квот, связанных с IAM?
Да, по умолчанию ваш аккаунт AWS имеет начальные квоты, заданные для всех сущностей, связанных с IAM. Дополнительные сведения см. в разделе Ограничения, применимые к сущностям и объектам IAM.

Эти квоты могут изменяться. Если вам необходимо увеличить квоту, можно использовать форму увеличения сервисных лимитов на странице «Свяжитесь с нами», выбрав значение Группы и пользователи IAM в раскрывающемся списке Тип ограничения.

Multi-Factor Authentication

Вопрос. Что такое AWS MFA?
AWS Multi-Factor Authentication (AWS MFA) обеспечивает дополнительный уровень безопасности, который можно использовать в вашей среде AWS. Можно активировать AWS MFA для вашего аккаунта AWS, а также для отдельных пользователей AWS Identity and Access Management (IAM), которых вы создаете под своим аккаунтом.

Вопрос. Как работает AWS MFA?
Есть два основных способа выполнить аутентификацию с помощью устройства AWS MFA.

  • Пользователи Консоли управления AWS. При включенной MFA пользователю, входящему на сайт AWS, предлагается указать свои имя пользователя и пароль (первый фактор – знание), после чего запрашивается код аутентификации с устройства AWS MFA (второй фактор – владение). Все сайты AWS, где требуется вход, например Консоль управления AWS, полностью поддерживают AWS MFA. Можно также использовать AWS MFA совместно с функцией S3 Secure Delete для дополнительной защиты ваших хранимых версий Amazon S3.
  • Пользователи API AWS. Можно обеспечить принудительное выполнение MFA-аутентификации путем добавления связанных с MFA ограничений в политики IAM. Для получения доступа к защищенным таким образом API и ресурсам разработчики могут запрашивать временные данные для доступа и передавать дополнительные параметры MFA в свои запросы API AWS Security Token Service (STS) (сервис, создающий временные данные для доступа). Проверенные с помощью MFA временные данные, подтверждающие права доступа, можно использовать для вызова защищенных MFA API и ресурсов. Примечание. Сервис AWS STS и API, защищенные с помощью MFA, в данное время не поддерживают ключ безопасности U2F как MFA.

Вопрос. Как можно защитить ресурсы AWS с помощью MFA?
Необходимо выполнить два простых действия.

1. Получить устройство MFA. Существует три варианта:

  • Приобрести аппаратный ключ безопасности YubiKey у стороннего поставщика Yubico.
  • Приобрести аппаратное устройство у стороннего поставщика Gemalto.
  • Установить виртуальное MFA-совместимое приложение на устройство, например на смартфон.

Посетите страницу MFA AWS, чтобы узнать, как приобрести аппаратное или виртуальное устройство MFA.

2. После приобретения устройства MFA его необходимо активировать в консоли IAM. Можно также использовать сервис AWS CLI, чтобы активировать виртуальную MFA и аппаратную MFA (устройство Gemalto) для пользователя IAM. Примечание. Сервис AWS CLI в настоящее время не поддерживает активацию ключей безопасности U2F.

Вопрос. Взимается ли плата за использование AWS MFA?
AWS не взимает дополнительной платы за использование AWS MFA с вашим аккаунтом AWS. Тем не менее, если вы хотите использовать физическое устройство MFA, необходимо будет приобрести совместимое с AWS MFA устройство MFA от стороннего поставщика – Gemalto или Yubico. Для получения дополнительных сведений посетите веб-сайт Yubico или Gemalto.

Вопрос. Можно ли иметь несколько активных устройств MFA для моего аккаунта AWS?
Да. Каждый пользователь IAM может иметь отдельное устройство MFA. При этом каждое идентификационное удостоверение (пользователь IAM или аккаунт root) может быть связано лишь с одним устройством MFA.

Вопрос. Можно ли использовать свой ключ безопасности U2F со множеством аккаунтов AWS?

Да. AWS позволяет использовать один ключ безопасности U2F с несколькими пользователями с правами root и пользователями IAM в разных аккаунтах.

Вопрос. Можно ли использовать виртуальную, аппаратную MFA или MFA с помощью SMS в нескольких аккаунтах AWS?
Нет. Устройство MFA или номер мобильного телефона, используемые для виртуальной, аппаратной MFA или MFA с помощью SMS, связываются лишь с одним индивидуальным идентификационным удостоверением AWS (пользователем IAM или аккаунтом root). Если на вашем смартфоне установлено TOTP-совместимое приложение, на одном смартфоне можно создать несколько виртуальных устройств MFA. Как и аппаратные устройства MFA (Gemalto), каждое из виртуальных устройств MFA связывается лишь с одним идентификационным удостоверением. Если вы разъедините (деактивируете) устройство MFA, его можно будет повторно использовать с другим идентификационным удостоверением AWS. Устройство MFA, связанное с устройством MFA, в данное время не может одновременно использоваться более чем одним идентификационным удостоверением.

Вопрос. У меня уже имеется аппаратное устройство MFA (Gemalto) от моего работодателя или от другого сервиса, которым я пользуюсь. Могу ли я повторно использовать это устройство с AWS MFA?
Нет. Чтобы поддерживать использование вашего устройства MFA (Gemalto), AWS MFA необходимо знать связанный с ним уникальный секрет. Поскольку ограничения для обеспечения безопасности требуют, чтобы такие секреты никогда не становились достоянием нескольких сторон, AWS MFA не может поддерживать использование вашего существующего устройства Gemalto. С AWS MFA можно использовать только совместимое аппаратное устройство MFA, приобретенное у компании Gemalto. Можно повторно использовать существующий ключ безопасности U2F с AWS MFA, так как ключи безопасности U2F не раскрывают никакие секреты нескольким сторонам.

Приобретение устройства MFA

Вопрос. У меня возникла проблема с заказом устройства MFA на веб-сайте стороннего поставщика. Где я могу получить помощь?
Обратитесь в службу поддержки пользователей компании Yubico или Gemalto.

Вопрос. Мне пришло дефектное или поврежденное устройство MFA от стороннего поставщика. Где я могу получить помощь?
Обратитесь в службу поддержки пользователей компании Yubico или Gemalto.

Вопрос. Мне только что пришло устройство MFA от стороннего поставщика. Что можно сделать?
Чтобы включить AWS MFA для своего аккаунта AWS, нужно просто активировать устройство MFA. См. консоль IAM для выполнения этой задачи.

Инициализация виртуального устройства MFA

Вопрос. Что такое виртуальное устройство MFA?
Виртуальное устройство MFA – это запись, созданная в TOTP-совместимом программном приложении, которое может генерировать шестизначные коды аутентификации. Это программное приложение можно запускать на любом совместимом вычислительном устройстве, например на смартфоне.

Вопрос. В чем различие между аппаратным и виртуальным устройствами MFA?
Виртуальные устройства MFA могут использовать те же протоколы, что и физические устройства MFA. Виртуальные устройства MFA – это программные устройства, которые можно запустить на ваших физических устройствах, например на смартфонах. Кроме того, большинство виртуальных приложений MFA позволяют включать несколько виртуальных устройств MFA, что делает их более удобными по сравнению с физическими устройствами MFA.

Вопрос. Какие виртуальные приложения MFA поддерживаются в AWS MFA?
С AWS MFA можно использовать приложения, которые генерируют TOTP-совместимые коды аутентификации, например приложение Google Authenticator. Поддерживается инициализация виртуальных устройств MFA путем автоматического сканирования QR-кода с помощью камеры устройства или ввода начального числа вручную в виртуальном приложении MFA.

Посетите страницу MFA, на которой приведен список поддерживаемых виртуальных приложений MFA.

Вопрос. Что такое QR-код?
QR-код представляет собой двумерный штрихкод, который можно прочитать с помощью специализированных устройств для чтения QR-кодов и большинства смартфонов. Этот код состоит из черных квадратов, образующих квадрат большего размера на белом фоне. QR-код содержит информацию о настройках безопасности, необходимую для инициализации виртуального устройства MFA в вашем виртуальном MFA-приложении.

Вопрос. Как инициализировать новое виртуальное устройство MFA?
В консоли IAM можно настроить новое виртуальное устройство MFA для ваших пользователей IAM, а также для вашего аккаунта root в AWS. Кроме того, инициализировать новые виртуальные устройства MFA для вашего аккаунта можно с помощью команды aws iam create-virtual-mfa-device в интерфейсе командной строки AWS или API CreateVirtualMFADevice. Команда aws iam create-virtual-mfa-device и API CreateVirtualMFADevice возвращают необходимую информацию о настройке, называемую начальным числом, для настройки виртуального устройства MFA в вашем приложении, совместимом с AWS MFA. Можно либо разрешить пользователям IAM вызывать этот API напрямую, либо выполнять для них первоначальную инициализацию.

Вопрос. Как следует обращаться с материалом начальных чисел для виртуальных устройств MFA и распределять его?

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

Вопрос. Как предоставить пользователю IAM возможность управлять виртуальными устройствами MFA под моим аккаунтом?
Предоставьте пользователю IAM разрешение вызывать API CreateVirtualMFADevice. Этот API можно использовать для инициализации новых виртуальных устройств MFA.

SMS MFA

Вопрос. Можно ли еще получить ознакомительный доступ к SMS MFA?

Мы больше не регистрируем новых участников на режим ознакомления с SMS MFA. Мы рекомендуем использовать MFA в аккаунте AWS, применяя ключ безопасности U2F, аппаратное устройство или виртуальное устройство MFA.

Вопрос. Когда закончится режим ознакомления для MFA с помощью SMS?

С 1 февраля 2020 года AWS больше не будет требовать от пользователей IAM ввода шестизначного кода MFA, если пользователь IAM настроен с помощью «устройства SMS MFA». Эти пользователи больше не будут получать SMS-код при входе в систему. Мы рекомендуем использовать MFA, применяя ключ безопасности U2F, аппаратное или виртуальное устройство MFA. Возможность MFA с помощью SMS можно продолжать использовать до 31 января 2020 года.

Включение устройств AWS MFA

Вопрос. Где можно включить AWS MFA?
AWS MFA для аккаунта AWS и ваших пользователей IAM можно включить в консоли IAM, в интерфейсе командной строки AWS или с помощью вызова API. Примечание. Сервис AWS CLI и API AWS в настоящее время не поддерживают активацию ключа безопасности U2F.

Вопрос. Какая информация потребуется для активации аппаратного или виртуального устройства MFA?
Если вы активируете устройство MFA с помощью консоли IAM, вам потребуется только само устройство. Если вы используете интерфейс командной строки AWS или API IAM, вам потребуются следующие сведения:

1. Серийный номер устройства MFA. Формат серийного номера зависит от того, какой тип устройства вы используете – аппаратное или виртуальное.

– У аппаратных устройств MFA серийный номер указан на этикетке со штрихкодом на задней поверхности устройства.
– У виртуальных устройств MFA серийным номером является значение параметра Amazon Resource Name (ARN), возвращенное после выполнения команды iam-virtualmfadevicecreate в интерфейсе командной строки AWS или в результате вызова API CreateVirtualMFADevice.

2. Два последовательных кода MFA, отображаемых устройством MFA.

Вопрос. Мое устройство MFA, кажется, работает нормально, но я не могу активировать его. Что можно сделать?
Для получения помощи свяжитесь с нами.

Использование AWS MFA

Вопрос. Если я включу AWS MFA для своего аккаунта с правами root в AWS или пользователей IAM, нужно ли им будет всегда использовать MFA для входа в Консоль управления AWS?
Да. Пользователь AWS с правами root и пользователи IAM должны иметь с собой устройство MFA всякий раз, когда они будут входить на какой-либо веб-сайт AWS.

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

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

Вопрос. Если я включу AWS MFA для своего аккаунта root в AWS или для моих пользователей IAM, нужно ли им будет всегда выполнять задание MFA для вызова API AWS напрямую?
Нет, это не обязательно. Тем не менее вам нужно будет выполнять задание MFA, если вы планируете вызывать API, доступ к которым защищен с помощью MFA.

Если вы вызываете API AWS, используя ключи доступа своего аккаунта root в AWS или пользователей IAM, вводить код MFA не потребуется. По соображениям безопасности мы рекомендуем удалить из аккаунта root в AWS все ключи доступа и использовать для вызова API AWS только ключи доступа пользователей IAM с разрешениями соответствующего уровня.

Примечание. Ключи безопасности U2F в данное время не работают с API, защищенными с помощью MFA, и не могут использоваться как MFA для API AWS.

Вопрос. Как выполнить вход на портал AWS и в Консоль управления AWS, используя свое устройство MFA?
Вход выполняется в два этапа, как описано ниже.

Если для входа в AWS вы используете аккаунт с правами root, действуйте обычным образом, вводя при появлении запроса имя пользователя и пароль. Чтобы войти в качестве пользователя IAM, используйте URL-адрес своего аккаунта и по запросу введите имя пользователя и пароль.

Если вы активировали виртуальную, аппаратную MFA или MFA с помощью SMS, введите шестизначный код MFA, который отображается на устройстве MFA. Если вы активировали ключ безопасности U2F, вставьте его в USB-порт компьютера, подождите, пока ключ мигнет, а затем прикоснитесь к кнопке или золотому диску на ключе.

Вопрос. Влияет ли AWS MFA на то, каким образом я получаю доступ к API AWS Service?
AWS MFA изменяет способ доступа пользователей IAM к API AWS Service только в том случае, если администраторы аккаунта решат включить доступ к API, защищенный с помощью MFA. Администраторы могут активировать эту возможность, чтобы добавить дополнительный уровень безопасности для доступа к конфиденциальным API, требуя от вызывающих их выполнять аутентификацию с помощью устройства AWS MFA. Дополнительную информацию см. в документации по доступу к API, защищенным с помощью MFA.

К другим исключениям относятся API управления версиями S3 PUT Bucket, API управления версиями GET Bucket и API DELETE Object. Это позволяет требовать, чтобы для удаления или изменения состояния управления версиями вашей корзины использовалась многофакторная аутентификация. Дополнительную информацию см. в документации по S3, где более подробно обсуждается настройка корзины с помощью MFA Delete.

Во всех остальных случаях AWS MFA в настоящее время не изменяет способ доступа к API сервисов AWS.

Примечание. Ключи безопасности U2F в данное время не работают с API, защищенными с помощью MFA, и не могут использоваться как MFA для API AWS.

Вопрос. Можно ли использовать полученный код MFA более одного раза для виртуальной или аппаратной MFA?
Нет. По соображениям безопасности каждый код MFA, полученный с помощью виртуального или аппаратного устройства MFA, можно использовать лишь однажды.

Вопрос. Меня недавно попросили повторно синхронизировать устройство MFA, поскольку мои коды MFA были отклонены. Стоит ли мне беспокоиться по этому поводу?
Нет, такое может происходить время от времени. Для виртуальной и аппаратной MFA необходимо, чтобы часы вашего устройства аутентификации были синхронизированы с часами на наших серверах. Иногда показания часов расходятся. Если это происходит, когда вы используете устройство MFA для выполнения входа на защищенные страницы веб-сайта AWS или в Консоль управления AWS, AWS автоматически пытается повторно синхронизировать устройство MFA, попросив вас предоставить два последовательных кода MFA (аналогично тому, как это происходило в процессе активации).

Ключи безопасности U2F не могут рассинхронизироваться, поэтому их нет надобности синхронизировать.

Вопрос. Мое устройство MFA, кажется, работает нормально, но мне не удается использовать его для входа в Консоль управления AWS. Что можно сделать?
Если вы используете виртуальную или аппаратную MFA, рекомендуем повторно синхронизировать устройства MFA с учетными данными пользователя IAM. Если вы уже пытались выполнить повторную синхронизацию и по-прежнему сталкиваетесь с проблемами при входе в систему, можно войти с использованием альтернативных факторов аутентификации и выполнить сброс устройства MFA.

Если вы используете ключи безопасности U2F, можно войти с помощью альтернативных факторов аутентификации и перезагрузить устройство MFA.

Если проблемы решить не удалось, обратитесь к нам за помощью.

Вопрос. Мое устройство аутентификации MFA потеряно, повреждено, украдено или не работает, и теперь я не могу выполнить вход в Консоль управления AWS. Что можно сделать?
Если устройство MFA связано с аккаунтом root AWS, можно сделать следующее.

  • Можно выполнить сброс устройства MFA из Консоли управления AWS, выполнив вход в консоль с вашим паролем, а затем подтвердив адрес электронной почты и номер телефона, связанные с аккаунтом root.
  • Если ваше устройство MFA потеряно, повреждено, украдено или не работает, можно войти с помощью альтернативных факторов аутентификации, деактивировать устройство MFA и активировать новое устройство MFA. С точки зрения безопасности рекомендуем изменить пароль аккаунта root.
  • Если требуется новое устройство MFA, можно приобрести его у стороннего поставщика, Yubico или Gemalto, либо выделить новое виртуальное устройство MFA своему аккаунту, используя консоль IAM.
  • Если вы пробовали рассмотренные выше подходы и по-прежнему не можете войти в систему, обратитесь в службу AWS Support.

Вопрос. Как отключить AWS MFA?

Чтобы отключить AWS MFA для вашего аккаунта AWS, можно деактивировать ваше устройство MFA, используя страницу Security Credentials. Чтобы отключить AWS MFA для ваших пользователей IAM, можно использовать консоль IAM или интерфейс командной строки AWS.

Вопрос. Можно ли использовать AWS MFA в GovCloud?
Да, аппаратные и виртуальные устройства AWS MFA можно использовать в GovCloud.

Доступ к API, защищенный с помощью MFA

Вопрос. Что такое доступ к API, защищенный с помощью MFA?
Доступ к API, защищенный с помощью MFA, – это дополнительные функциональные возможности, позволяющие администраторам аккаунтов обеспечивать принудительную дополнительную аутентификацию для определенных API, требуя от пользователей указывать второй фактор идентификации в дополнение к паролю. В частности, это позволяет администраторам включать в свои политики IAM условия, которые проверяют и запрашивают MFA-аутентификацию для доступа к отдельным API. Пользователи, выполняющие вызов этих API, должны сначала получить временные данные для доступа, которые подтверждают, что пользователь ввел действительный код MFA.

Вопрос. Можно ли использовать свой ключ безопасности U2F с API, защищенными с помощью MFA?

Нет. API, защищенные с помощью MFA, в данное время не поддерживают ключи безопасности U2F.

Вопрос. Какую проблему решает доступ к API, защищенный с помощью MFA?
Раньше клиенты могли потребовать MFA для доступа к Консоли управления AWS, но не могли обеспечить принудительное выполнение требований MFA со стороны разработчиков и приложений, непосредственно взаимодействующих с API сервисов AWS. Доступ к API, защищенный с помощью MFA, обеспечивает повсеместное принудительное соблюдение политик IAM независимо от пути доступа . В результате теперь вы можете разработать собственное приложение, которое использует AWS и предлагает пользователям выполнить MFA-аутентификацию перед вызовом API, обладающих широкими возможностями, или получением доступа к конфиденциальным ресурсам.

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

  1. Назначьте устройство MFA вашим пользователям IAM. Вы можете приобрести аппаратный брелок или загрузить бесплатное TOTP-совместимое приложение для смартфона, планшета или компьютера. Дополнительные сведения об устройствах AWS MFA см. на странице сведений о MFA.
  2. Включите доступ к API, защищенный с помощью MFA, создав политики разрешений для пользователей и (или) групп IAM, для которых MFA-аутентификация должна быть обязательной. Дополнительные сведения о синтаксисе языка политики доступа см. в документации по языку политики доступа.

Вопрос. Как разработчики и пользователи получают доступ к API и ресурсам, защищенным с помощью MFA?
Разработчики и пользователи могут использовать доступ к API, защищенным с помощью MFA, в Консоли управления AWS и в самих API.

Чтобы выполнить вход в Консоль управления AWS, любой пользователь IAM с включенной MFA должен выполнить аутентификацию с помощью своего устройства. Пользователи без включенной MFA не могут получить доступ к API и ресурсам, защищенным с помощью MFA.

На уровне API разработчики могут интегрировать AWS MFA в свои приложения, чтобы пользователи получали запрос на аутентификацию с помощью назначенных им MFA-устройств перед вызовом мощных API или получением доступа к конфиденциальным ресурсам. Разработчики включают эти функциональные возможности путем добавления дополнительных параметров MFA (серийного номера и кода MFA) в запросы на получение временных данных, подтверждающих права доступа (такие запросы называются также «запросами на сеанс»). Если параметры действительны, возвращаются временные данные для доступа, которые указывают состояние MFA. Дополнительную информацию см. в документации по временным данным, подтверждающим права доступа.

Вопрос. Кто может использовать доступ к API, защищенный с помощью MFA?
Доступ к API, защищенный с помощью MFA, могут бесплатно использовать все клиенты AWS.

Вопрос. С какими сервисами работает доступ к API, защищенный с помощью MFA?
Доступ к API, защищенный с помощью MFA, поддерживается всеми сервисами AWS, которые поддерживают временные данные для доступа. Полный список поддерживаемых сервисов см. на странице Сервисы AWS, работающие с IAM (ориентируйтесь на столбец, где обозначена поддержка временных данных для доступа).

Вопрос. Что произойдет, если при запросе временных данных для доступа пользователь предоставит некорректную информацию с устройства MFA?
Запрос на предоставление временных данных для доступа будет отклонен. Запросы на предоставление временных данных для доступа, в которых указываются параметры MFA, должны содержать корректный серийный номер устройства, связанного с пользователем IAM, а также действительный код MFA.

Вопрос. Управляет ли доступ к API, защищенный с помощью MFA, доступом для аккаунтов root в AWS?
Нет, доступ к API, защищенный с помощью MFA, управляет только доступом для пользователей IAM. Аккаунты root не привязаны к политикам IAM, поэтому мы рекомендуем для взаимодействия с API сервисов AWS создавать пользователей IAM, а не данные доступа для аккаунтов root в AWS.

Вопрос. Должны ли пользователи иметь назначенные им устройства MFA, чтобы использовать доступ к API, защищенный с помощью MFA?
Да, пользователю сначала должно быть назначено уникальное аппаратное или виртуальное устройство MFA.

Вопрос. Совместим ли доступ к API, защищенный с помощью MFA, с объектами S3, очередями SQS и темами SNS?
Да.

Вопрос. Как доступ к API, защищенный с помощью MFA, взаимодействует с существующими сценариями использования MFA, например S3 MFA Delete?
Доступ к API, защищенный с помощью MFA, и S3 MFA Delete не взаимодействуют друг с другом. В настоящее время S3 MFA Delete не поддерживает временные данные, подтверждающие права доступа. Вместо этого вызовы API S3 MFA Delete должны совершаться с помощью долговременных ключей доступа.

Вопрос. Работает ли доступ к API, защищенный с помощью MFA, в GovCloud?
Да.

Вопрос. Работает ли доступ к API, защищенный с помощью MFA, для федеративных пользователей?
Клиенты не могут использовать доступ к API, защищенным с помощью MFA, для управления доступом федеративных пользователей. API GetFederatedSession не принимает параметры MFA. Поскольку федеративные пользователи не могут выполнять аутентификацию с помощью устройств AWS MFA, они не могут получать доступ к ресурсам, для которых назначен доступ к API, защищенный с помощью MFA.

Урок 39. Списки контроля доступа ACL (Access List Control)

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

Запретить/разрешить мы можем на основе IP адресов, портов и задействованных протоколов. На этом принципе и работают списки управления доступом ACL ( Access Control List ).

Другим примером использования списков доступа является запрет поступающих на маршрутизатор пакетов протокола ICMP. Как мы знаем с помощью ICMP работают утилиты Ping, Traceroute/Tracert. С помощью данных утилит можно просканировать сеть, а это нежелательно с точки зрения политики безопасности каждой сети.

Списки доступа позволяют фильтровать трафик на входе и выходе интерфейса маршрутизатора.

И в чем же разница?

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

Когда ACL настроены на выходе интерфейса, то трафик фильтруется сразу же после процесса маршрутизации:

Данная особенность может быть полезна при определенных обстоятельствах.

Так что же из себя представляют списки доступа и как они работают?

Списки доступа содержат просто набор инструкций какие порты и адреса блокировать, а какие наоборот разрешить. Этих инструкций может от нескольких единиц до десятков.

При поступлении трафика проверка списка доступа начинается сверху вниз, то есть с первой инструкции. Как только будет найдено совпадение проверка списка прекратится и будет выполнено действие, указанное в инструкции (заблокировать или пропустить).

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

Cisco IOS поддерживает 3 типа ACL:

  • стандартные списки
  • расширенные списки
  • именованные списки

Стандартные списки позволяют проверять только IP адрес отправителя. Например,в нашем 1-ом примере доступ в интернет Алисе и Кате можно закрыть с помощью стандартного списка. В данном случае блокируется абсолютно весь трафик, проходящий через маршрутизатор. Стандартные списки доступа рекомендуется устанавливать как можно ближе к отправителю.

Расширенные списки позволяют фильтровать пакеты на основе адресов, портов и протоколов получателя и отправителя.

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

Электронная почта работает по протоколам POP/SMTP (порты 110/ 25). Следовательно можно внести исключение в списки доступа исходя из выше описанных условий.

То же самое касается и IP телефонии — выбираем задействованный протокол и порт и вносим в список доступа.

Расширенные списки рекомендуется устанавливать ближе к получателю.

Именованные списки являются теми же стандартными и расширенными ACL, однако предоставляют более гибкие возможности для редактирования (об этом немного позже).


Рассмотрим какие команды используются в каждом типе ACL, а затем применим их на примере.

Инструкция задается следующей командой:

Router(config)# access-list номер permit | deny IP_адрес_отправителя инвертированная_маска (wildcard mask)

Router(config)# access-list 1 deny 192.168.1.0 0.0.0.255

Router(config)# access-list 1 permit 10.1.0.0 0.0.255.255

Router(config)# access-list 1 deny any

Номер списка принимает значения от 1 до 99. Цифры не означают приоритет или упорядоченность. Это просто номер списка. Затем следует команда permit (разрешить) или deny (запретить). С помощью инвертированной маски (wildcard mask) мы можем определить диапазон адресов, на которые будет распространяться запрет/разрешение.

В первой команде мы запрещаем сеть 192.168.1.0/24, а во второй разрешаем сеть 10.1.0.0/16.

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

А как работает инвертированная маска (wildcard mask)?

Работа инвертированной маски основана на следующем принципе.

На тех битовых позициях, где установлен 0 IP адрес устройства должен совпадать с адресом, указанным в настройках ACL.

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

Пример №1

Необходимо разрешить доступ диапазону адресов 192.168.1.0 — 192.168.1.255. Так как первые 3 октета должны совпадать полностью, а четвертый может принимать любые значения, то используем маску 0.0.0.255. Вот как это выглядит на рисунке

Пример №2

К диапазону 192.168.1.0-192.168.1.255 добавим еще один диапазон 192.168.2.0 — 192.168.2.255.

Теперь у нас должны совпадать первые 2 октета полностью и первые 6 бит третьего октета. Поэтому маска у нас 0.0.3.255. А в настройках ACL мы укажем адрес 192.168.0.0. Можно, конечно, указать сразу 2 отдельные команды на каждый диапазон, с помощью маски мы можем сократить запись

Пример №3

Необходимо разрешить/запретить диапазон 200.40.0.4 — 200.40.0.7. У нас совпадают полностью первые 3 октета и первые 6 бит четвертого октета:

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

Router(config-if)# ip access-group номер_применяемого_списка in | out

in — входящий трафик

out — исходящий трафик

Алгоритм работы стандартного списка выглядит так:

Расширенный список доступа

Расширенные списки доступа имеют номера от 100 до 199.

Команды имеют довольно широкий набор опций, поэтому покажу наиболее общий пример команды:

Router(config)#access-list номер permit | deny протокол IP_адрес_отправителя инвертированная_маска порт_отправителя IP_адрес_получателя инвертированная_маска порт_получателя

Router(config)#access-list 100 permit tcp 192.168.1.0 0.0.0.255 eq 80 10.1.1.0 0.0.0.255 eq 443

Данная команда разрешает TCP трафик от хостов с диапазоном 192.168.1.0/24 на хосты с диапазоном 10.1.1.0/24. Причем порты отправителя должны быть равны 80, а порты получателя — 443. Если все эти условия соблюдаются, то пакет пропускается, если нет, то переходит к следующей команде.

Router(config)#access-list 100 deny tcp any host 172.16.1.5 gt 5000

А вот эта команда запрещает весь TCP трафик от любого хоста на конкретный хост с адресом 172.16.1.5. Причем запрет действует при условии, что запросы идут на порты получателя от 5001 и выше.

В конце списка всегда следует неявная команда, запрещающая весь трафик.

Не забудь определить интерфейс и направление трафика для фильтрации.

Вот как выглядит алгоритм работы расширенных списков:

Для просмотра настроек используй следующие команды:

Router# show running-config

Router# show ip access-lists

Router# show ip access-lists interface название_интерфейса

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

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

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

Синтаксис команд представлен ниже.

Для стандартных списков:

Router(config)# ip access-list standard название

Router(config-std-nacl)# permit host IP_адрес_отправителя

Router(config-std-nacl)# deny IP_адрес_отправителя инвертированная_маска

Для расширенных списков:

Router(config)# ip access-list extended название

Router(config-ext-nacl)# permit ip IP_адрес_отправителя инвертированная_маска IP_адрес_получателя инвертированная_маска

Router(config-ext-nacl)# deny tcp IP_адрес_отправителя инвертированная_маска порт_отправителя IP_адрес_получателя инвертированная_маска порт_получателя

Чтобы удалить ненужную команду достаточно узнать ее номер. Чтобы узнать номер введи команду:

Router# show ip access-list название

а затем укажи ее номер при удалении:

Router(config-ext-nacl)# no 10 — этого уже достаточно

Ну а чтобы добавить команду достаточно тоже указать номер и затем саму команду.

Обращаю твое внимание, что удаление и добавление строк списка происходит в режиме настройки ACL, например так:

Router(config-ext-nacl)# 5 deny ip any any

Пример использования списков доступа

Сеть состоит из 3 частей:

  • Внутренняя сеть — основная инфраструктура локальной сети любого предприятия.
  • Демилитаризованная зона DMZ — в ней располагаются сервера, которые доступны из интернета. Доступ во внутреннюю сеть из этой зоны закрыт из соображений безопасности.
  • Внешняя сеть — связывается напрямую с провайдером. Обычно состоит из маршрутизаторов и сетевых экранов (firewalls).

Именно по этому принципу и строятся сети предприятий.

Задача у нас следующая:

  1. Всем серверам из DMZ запретить доступ во внутреннюю сеть
  2. Всем серверам из DMZ разрешить двустороннюю связь в интернет
  3. Пользователям из интернета разрешить доступ на серверы в DMZ, учитывая протокол взаимодействия и порты TCP/UDP
  4. Разрешить доступ внутренним пользователям на серверы DMZ
  5. Запретить Алине и Саше доступ в интернет и DMZ, то есть они могут работать только во внутренней сети.

Пункт №1 можно решить с помощью расширенного списка на маршрутизаторе LAN_Router

На самом деле в данном примере серверы не имеет доступа к внутренним компьютерам, потому что подключены к различным интерфейсам маршрутизатора Firewall. Данный маршрутизатор ничего не знает о сети 192.168.1.0/24, поэтому не может перенаправить пакеты серверов к маршрутизатору LAN_Router. Однако достаточно маленькой ошибки в конфигурации и внутренние компьютеры станут доступны не только для DMZ, но и для внешней сети.

Поэтому список доступа на маршрутизаторе LAN_router безусловно необходим.

А какие ошибки могут привести к тому, что сеть LAN будет доступна для DMZ?

Например, на маршрутизаторе Firewall при настройке статического маршрута может быть по ошибке указан интерфейс, ведущий к маршрутизатору LAN_Router.

Или на маршрутизаторе LAN_Router будет выполнена команда redistribute connected . В данный момент между 2-мя маршрутизаторами настроен EIGRP. Если выполнить вышеназванную команду, то маршрутизатор Firewall узнает о сети LAN.

Пункты №2 и №3 не требуют списков доступа. Достаточно настроить правильно маршрутизацию и NAT на маршрутизаторе Firewall

Пункт №4. Внутренние пользователи уже имеют доступ в зону DMZ, однако связь будет работать только в одну сторону, так как мы закрыли доступ еще в п.1.

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

Решение простое — достаточно настроить NAT на маршрутизаторе LAN_Router. Тогда только внутренние пользователи смогут подключаться к серверам, а сервера уже не смогут из-за активированного списка доступа. Однако это не единственное решение

Пункт №5 решается с помощью стандартного списка

HTTP протокол: основные правила Интернета, которые должен знать каждый веб-разработчик. Как браузер взаимодействует с сервером.

HTTP коды ошибок клиента

Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике Серверы и протоколы и ее разделе HTTP протокол. Эта запись целиком и полностью посвящена ошибка клиента при взаимодействие по HTTP протоколу. Мы с тобой рассмотрим коды ошибок клиента HTTP. Вообще, коды ошибок клиента в HTTP протоколе могут быть расширены любым сервером, мы рассмотрим только коды ошибок клиента, которые указаны в стандарте HTTP 1.1. Сперва, как и обычно при рассмотрение кодов HTTP протокола, мы дадим общее описания кодам ошибок клиента, а затем рассмотрим по отдельности каждый из 18 HTTP кодов ошибок клиента.

HTTP коды ошибок клиента

Общая информация о HTTP кодах ошибок клиента

HTTP коды ошибок клиента говорят пользователю о том, что ему не удалось получить запрашиваемый ресурс, указанный в URI (запись про URI в HTTP), по вине самого пользователя или клиента, например, пользователь ошибся при вводе URL в браузере, в этом случае сервер даст ответ с кодом состояния 404. Все коды ошибок HTTP клиента начинаются с четверки. HTTP сервер всегда в случае ошибки клиента отправляет вместе с кодом состояния пояснения того, почему произошла ошибка, за исключение тех случаев, когда используется HTTP метод HEAD.

Давайте для удобства рассмотрения сведем в одну таблицу все коды ошибок HTTP клиента в одну таблицу. И не будем забывать, что в основе протокола HTTP лежит модель взаимодействия клиент-сервер, которая делит обязанности приложений на клиентские и серверные, рассматриваемый протокол довольно строго придерживается данной модели, и у нас есть специальные коды ошибок, которые происходят по вине серверных приложений и есть коды ошибок, которые происходят по вине человека или клиентского приложения, которым человек пользуется.

Код ошибки HTTP клиента Описание кода ошибки HTTP клиента
400 Bad Request Код состояния ошибки HTTP клиента 400: плохой запрос

Такой код состояния ошибки клиента вы можете увидеть тогда, когда сервер не понял ваш запрос из-за синтаксической ошибке в HTTP запросе.

401 Unauthorized Код состояния ошибки HTTP клиента 401: не авторизован

Такой код состояния ошибки клиента вы можете увидеть в том случае, если для доступа к ресурсу требуется аутентификация по соображениям безопасности HTTP сервера.

402 Payment Required Код состояния ошибки HTTP клиента 402: требуется оплата

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

403 Forbidden Код состояния ошибки HTTP клиента 403: запрещено

Такой код состояния ошибки клиента вы увидите в том случае, когда сервер вас прекрасно понял, но отказывается вам предоставлять доступ к ресурсу из-за того, что у вас недостаточно прав доступа.

404 Not Found Код состояния ошибки HTTP клиента 404: не найдено

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

405 Method Not Allowed Код состояния ошибки HTTP клиента 405: метод не дозволен

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

406 Not Acceptable Код состояния ошибки HTTP клиента 406: не приемлем

Этот код состояния вы увидите в том случае, когда HTTP сообщение вашего клиента содержит неправильные параметры для указанного в нем URI.

407 Proxy Authentication Required Код состояния ошибки HTTP клиента 407: требуется установления подлинности через прокси-сервер

Если вы видите этот код состояния ошибки клиента, то вам нужно пройти аутентификацию на прокси-сервере.

408 Request Timeout Код состояния ошибки HTTP клиента 408: истекло время ожидания запроса

Этот код состояния ошибки HTTP клиента вы увидите тогда, когда сервер устал ждать от вас сообщение.

409 Conflict Код состояния ошибки HTTP клиента 409: конфликт

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

410 Gone Код состояния ошибки HTTP клиента 410: удален

А этот код состояния ошибки клиента будет показан сервером в том случае, когда ресурс был доступен по указанному URI, но теперь его там нет.

411 Length Required Код состояния ошибки HTTP клиента 411: требуется длина

Этот код состояния ошибки клиента появляется в том случае, когда серверу нужно обязательно указывать поле заголовка Content-Lenght

412 Precondition Failed Код состояния ошибки HTTP клиента 412: предусловие неверно

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

413 Request Entity Too Large Код состояния ошибки HTTP клиента 413: объект запроса слишком велик

А такой код ошибки клиента можно увидеть в том случае, когда тело (HTTP объекты и тело сообщения) запроса слишком большое и сервер его получить не смог.

414 Request-url Too Long Код состояния ошибки HTTP клиента 414: URI запроса слишком длинный

Такой код ошибки клиента сервер выдаст в том случае, если URI запроса слишком длинный.

415 Unsupported Media Type Код состояния ошибки HTTP клиента 415: неподдерживаемый медиа тип

Сервер может выдать такой код состояния ошибки клиента в том случае, если не захочет работать с указанным типом данных (типы данных в HTTP) тем методом, который указан в запросе клиента

416 Requested Range Not Satisfiable Код состояния ошибки HTTP клиента 416: запрашиваемый диапазон не достижим

Данный код и ошибки клиента говорит нам о том, что диапазон фрагмента (единицы измерения в HTTP) в поле заголовка Range указан неверно.

417 Expectation Failed Код состояния ошибки HTTP клиента 417: ожидаемое неприемлимо

Код состояния ошибки клиента 417 появится в том случае, если сервер не сможет удовлетворить значению, указанному в поле заголовка Expect.

Далее мы рассмотрим более подробно коды ошибок HTTP клиента.

HTTP код ошибки 400, код ошибки 401, код ошибки клиента 402, код ошибки 403, HTTP код ошибки клиента 404, ошибка клиента 405

HTTP код ошибки клиента 400: Bad Request или неверный запрос. Сервер вернет ответ с кодом ошибки 400 в том случае, когда обнаружит, что HTTP запрос клиента содержит синтаксическую ошибку.

HTTP код ошибки клиента 401: Unauthorized или не авторизован. Код ошибки клиента 401 сервер отправляет в том случае, когда для доступа к ресурсу требуется авторизация, при этом ответ HTTP сервера должен (читай про требования HTTP протокола) включать поле заголовка WWW-Authenticate и перечень условий для аутентификации клиента, после чего клиент может повторить запрос к серверу с полем Authorization, в котором будут указаны все необходимые данные для авторизации.

HTTP код ошибки клиента 402: Payment Required или требуется оплата. Данный код ошибки клиента зарезервирован для будущего использования и предназначен для оповещения клиента о том, что для доступа к ресурсу ему необходимо произвести оплату. Обратите внимание: данный код ошибки клиент не используется ни хостингами, ни интернет-магазина, ни даже интернет-провайдерами.

HTTP код ошибки клиента 403: Forbidden или запрещено. HTTP код ошибки клиента 403 отправляется сервером в том случае, когда он отказывается выполнить ваш запрос, причин на то могут быть разными. При этом сервер не должен сообщать является ли эта мера временной или постоянной. Одной из причин появления HTTP кода 403 может быть то, что у пользователя недостаточно прав доступа к ресурсу.

HTTP код ошибки клиента 404: Not Found или не найдено. HTTP код ошибки клиента 404 – самый популярный код ошибки клиента, код ошибки 404 видел, наверное, каждый. Ведь для того, чтобы увидеть код ошибки 404 достаточно ввести неверный URL.

HTTP код ошибки клиента 405: Method Not Allowed или метод не дозволен. Код ошибки 405 сервер отправляет клиенту в том случае, когда для ресурса, указанного в URI, нельзя применить метод, указанный в запросе клиента. Код ошибки 405 появляется в основном из-за конфигураций безопасности сервера, когда администратор преднамеренно запрещает выполнение тех или иных методов HTTP запросов на сервере. При этом ответ сервера с кодом ошибки 405 должен содержать поле заголовка Allow, в котором будут указаны доступные метода для ресурса.

HTTP код ошибки 406, код ошибки 407, HTTP код ошибки клиента 408, код ответа сервера 409, код ошибки 410, код ошибки клиента 411, HTTP код 412

HTTP код ошибки клиента 406: Not Acceptable или не приемлем. Код ошибки 406 говорит клиенту о том, что введенный URI не приемлем с теми характеристиками, которые были указаны в HTTP заголовке (читай про параметры HTTP протокола). Если метод запроса был отличным от метода HEAD, то серверу нужно включить в тело сообщения список доступных характеристик для данного URI. Формат HTTP объекта определяется медиа типом в поле заголовка Content-Length и в зависимости от клиента и его возможностей подходящий вариант запроса может быть выбран автоматически, этот код применяется при обсуждении содержимого в HTTP.

HTTP код ошибки клиента 407: Proxy Authentication Required или требуется установление подлинности через прокси-сервер. HTTP код ошибки клиента 407 появится в том случае, когда клиенту для доступа к указанному ресурсу необходимо авторизоваться на прокси-сервере. Когда возникает код ошибки 407 прокси-сервер должен возвратить поле заголовка Proxy-Authenticate содержащее вызов (challenge), применяемый прокси-сервером для запрошенного ресурса. Код ошибки 407 аналогичен по своему действию с кодом 401.

HTTP код ошибки клиента 408: Request Timeout или истекло время ожидания запроса. Код ошибки 408 возникает в том случае, когда клиент не произвел запрос в течение того времени, которое сервер готов ждать, но клиент может повторить запрос.

HTTP код ошибки клиента 409: Conflict или конфликт. Код ошибки клиента 409 возникает в том случае, когда происходит конфликт между несколькими клиентами при доступе к одному ресурсу. Код ошибки 409 показывается клиенту только в том случае, когда тот может устранить конфликт и повторить свой запрос. HTTP ответ сервера должен предоставить максимум информации для пользователя, чтобы он устранил конфликт, и код 409 больше не появлялся. Чаще всего ошибка 409 появляется при использование метода PUT.

HTTP код ошибки клиента 410: Gone или удален. HTTP код ошибки клиента 410 будет отправлен сервером в том случае, когда ресурс удален и сервер не знает, где искать копию ресурса или его новую версию. В том случае, когда у сервера есть информация о том, что ресурс может быть восстановлен, ему не следует показывать ошибку 410, а лучше показать код ошибки 404.

HTTP код ошибки клиента 411: Length Required или требуется длина. Код ошибки 411 будет показан клиенту в том случае, когда серверу для корректной обработки запроса требуется длина содержимого. Клиент может повторить запрос, если добавит допустимое поле заголовка Content-Length, содержащее длину тела сообщения (message-body) в сообщении запроса.

HTTP код ошибки клиента 412: Precondition Failed или предусловие неверно. Код ошибки 412 будет выслан клиенту сервером в том случае, когда сервер не может выполнить условия, указанные в заголовке HTTP запроса.

HTTP код ошибки клиента 413, код ошибки клиента 414, ошибка клиента 415, ошибка 416, HTTP код 417

HTTP код ошибки клиента 413: Request Entity Too Large или объект запроса слишком большой. Код ошибки 413 появляется в том случае, когда объект, передаваемый в запросе клиента слишком большой и сервер его не может обработать. Сервер может закрыть соединение (здесь написано про HTTP соединения), чтобы не дать клиенту возможность продолжить запрос. Если такая ситуация временная, то сервер в своем сообщении вместе кодом ошибки 413 передает поле заголовка Retry-After, в котором указывает время, через которое запрос может быть повторен.

HTTP код ошибки клиента 414: Request-URI Too Long или запроса слишком длинный. Сервер отправляет сообщение с кодом ошибки 414 в том случае, когда URI, указанный в запросе слишком длинный. Ошибка 414 обычно возникает тогда, когда клиент пытается передать кучу параметров методом GET, а следовало бы использовать метод POST.

HTTP код ошибки клиента 415: Unsupported Media Type или неподдерживаемый медиа тип. Код ошибки 415 сервер отправляет в том случае, когда он отказывается обслуживать запрос из-за некорректного типа данных для ресурса, который указан в URI: когда метод выбранный в запросе не соответствует типу данных ресурса.

HTTP код ошибки клиента 416: Requested Range Not Satisfiable или запрашиваемый диапазон не достижим. Сервер отправит сообщение с кодом ошибки 416 в том случае, когда в поле заголовка запроса Range был указан неверный диапазон фрагмента.

HTTP код ошибки клиента 417: Expectation Failed или ожидаемое неприемлемо. Код ошибки 417 появляется в том случае, когда сервер не может удовлетворить значению Expect, которое указано в заголовке HTTP запроса.

Мы рассмотрели коды ошибок HTTP клиента, давайте перейдем к последнему классу кодов состояния — HTTP коды ошибок серевра. Позволю себе напомнить, что в HTTP еще есть информационные коды состояния, успешные коды состояния и коды перенаправления. А если тебе нужна информацию обо всех кодах состояния, обратись к справочнику HTTP кодов состояния, в котором есть полное описание всех кодов.

.NET Framework 4.0. Code Access Security

Отсекая лишнее


Автор: Щербунов Нейл Анатольевич
Источник: RSDN Magazine #4-2010

Опубликовано: 15.12.2010
Исправлено: 10.12.2020
Версия текста: 1.0

Введение.

Вопросы безопасности почти всегда являются сложнейшим компонентом любой IT-системы, будь то системы операционные, управления реляционными базами данных (более известные как СУБД), или, как в случае данной статьи, платформы разработки и построения прикладного программного обеспечения. Непростым делом является глубокое понимание этого компонента в любой из обозначенных систем, а грамотная его реализация является, с моей точки зрения, некой «печатью» ( hallmark , как выражаются наши коллеги на англоязычных форумах) заверяющей высочайшую квалификацию разработчика или команды, такое приложение создавших. Дело усугубляется еще и тем, что в типичном сценарии обсуждаемый вопрос находится на стыке «зон ответственности»: мало того, что приложение должно быть грамотно «обезопасено» тем самым квалифицированным разработчиком, так еще на целевой машине ее администратор (желательно не менее квалифицированный) должен настроить не менее безопасное окружение, в котором это приложение будет выполняться. Потому как если последний возьмет на вооружение простой и понятный (хоть и совершенно неправильный) подход «всем можно все», то можно уверенно сказать: разработчик зря потратил недели и месяцы своего труда, настраивая и проверяя все нюансы безопасной работы своего приложения. Администратор может быть также приверженцем противоположного подхода, который утрировано можно выразить как «никому нельзя ничего». Кстати, вполне здравый подход, по крайней мере как первая фаза построения безопасной IT-инфраструктуры предприятия. Как бы то ни было, разработчику, пишущему код управления безопасностью приложения, все время приходится держать в голове вопросы типа «а что такого может выставить в настройках администратор целевой машины, что вся моя стройная система перестанет работать»?

В .NET Framework, одной из систем, подверженных все тем же трудностям security-«состыковки», с самого начала было приложено очень немало усилий, дабы совместная работа двух обозначенных выше IT-профессионалов протекала максимально гладко, но не в ущерб безопасности кода как такового. Был разработан даже целый новый «вектор» приложения усилий в этом направлении – Code Access Security (он же CAS), авторизующий на доступ к защищаемому ресурсу не пользователя (классический подход), а сам код как таковой. Идея была зело хороша, а вот ее реализация… Ну, скажем так, получилась неоднозначной. Почему оно так получилось, пойдет речь в следующей главе, Code Access Security, начало. Но, как бы то ни было, все так и катилось вплоть до последней, 4-й версии платформы .NET Framework, в которой CAS получил буквально второе рождение, так как, фактически, был пересмотрен и перестроен чуть ли не с самого фундамента. Самое главное, с точки зрения автора, что “CAS ver. 4.0” стал гораздо понятнее, а вследствие того, гораздо практичнее для применения даже в относительно простых проектах, авторы которых до того не считали возможным применения этого механизма в силу как сложности его реализации, так и последующей поддержки на конечной машине. В новой версии была пересмотрена сама идеология ограничения доступа к коду и, что приятно, удалены множественные сущности, фигурировавшие в предыдущих версиях этой технологии, и делающие ее столь сложной для изучения. Новый вариант CAS-безопасности значительно компактнее, логичнее, более управляем, да и просто более “прозрачен”.

В данной статье автор сначала кратко рассмотрит архитектуру CAS версий предыдущих (до 4.0), дабы читатели «со стажем» могли вспомнить (а может, и просто узнать) исходную точку, с которой все началось. После такого легкого «экскурса в прошлое» мы перейдем к Code Access Security в версии .NET 4.0 и сравним – что же нового появилось и, что может даже важнее, что же было удалено из этой подсистемы безопасности. Нас также ждут довольно интенсивные практические работы с кодом (все примеры написаны на C#), призванные полнее раскрыть концепции нового подхода и показать «подводные камни» его применения к реальным приложениям. Не обойдется и без этаких «мини-тестов», когда надо будет предсказать поведение демонстрационного приложения без его запуска. Правильный ответ подтвердит корректное понимание теории того или иного аспекта безопасного кода. Разумеется, после ответа «вслепую» нужно запустить приложение и проверить догадку практикой.

Надеюсь, что знакомство с «новым-старым» инструментом безопасности будет приятным и, самое главное, понятным для читателей практически любого уровня знакомства с платформой .NET как версии текущей, так и любой из предыдущих. Разумеется, автор не рискнет предложить данную статью как базовый учебник C#/.NET Framework, все же вопросы безопасности всегда входили (и продолжают) в категорию «advanced». Тем не менее, материал будет излагаться настолько простым языком, насколько это в принципе возможно при изложении непростых концепций. Интересного и познавательного чтения!

Code Access Security, начало

Давайте бросим беглый взгляд на дела «давно минувших дней» и постараемся очень кратко обрисовать вопрос – как все было раньше? Хотя, возможно, более правильно даже сказать «как есть сейчас»? Поскольку .NET 4-й еще не настолько «заматерел», чтобы безоговорочно выпихнуть из сектора разработки ПО своих младших собратьев… Ну, как бы то ни было, но вплоть до последней версии платформы компонент CAS оперировал несколькими основополагающими сущностями:

  • Свидетельство или доказательство (оно же evidence ) – характерная черта, «метка» сборки ( assembly ), которой она пытается убедить среду исполнения CLR в своей принадлежности той или иной кодовой группе ( code group ). Бывает двух основных типов: происхождение сборки (пример – URL или Zone ) и подпись сборки (пример – Strong Name или Hash ).
  • Кодовая группа (она же code group ) – «мостик» между доказательством и связанным с ним набором разрешений ( set of permissions , permissions set ). Все сборки, попавшие в данную кодовую группу, будут иметь одинаковые полномочия (полномочия как раз и есть те самые наборы). Framework поставляется с несколькими предопределенными группами (пример – Internet_Zone или Restricted_Zone ).
  • Условие членства (оно же membership conditions ) – атрибут кодовой группы . Сообщает, какие именно свидетельства должна предоставить сборка, претендующая на свою включение в ту кодовую группу, к которой относится данный membership conditions . Скажем, предопределенная группа ‘Microsoft Strong Name’ имеет в качестве условия членства в ней наличие у сборки строгого имени, присвоенного компанией Microsoft. Если у загружаемой сборки таковой подписи не наблюдается – у нее нет ни единого шанса попасть в столь уважаемую кодовую группу.
  • Набор разрешений (он же set of permissions или permissions set ) – контейнер, содержащий одно и более разрешение ( permission ). И снова, Framework поставляется с несколькими предопределенными наборами (пример – Internet или Everything );
  • Разрешение (оно же permission ) – центральная, пожалуй, сущность всей технологии. Это то, что должна иметь сборка, желающая получить доступ к критичным (с точки зрения безопасности) ресурсам системы. И, как вы уже догадываетесь или просто знаете, Framework вновь поставляется с целой россыпью таких разрешений (например, FileIOPermission или RegistryPermission).

Далее, чтобы все это хозяйство себя проявило, и мы получили бы с него реальные выгоды, требовались усилия двух человек как минимум – разработчика и администратора. Первый применял CAS в своем коде двумя путями:

  • декларативным , например, так:

  • и императивным , например, так:

По сути, оба подхода выполняли одну и ту же процедуру – выясняли, какие именно разрешения предоставил сборке администратор целевого компьютера. А как и чем он их назначал? Специально для второго участника вопросов безопасности была предусмотрена утилита (более точно – оснастка консоли) по имени Mscorcfg.msc (полный путь к ней – %Systemroot%\Microsoft.NET\Framework\versionNumber\Mscorcfg.msc, или она же под вывеской ‘.NET Framework Framework> Configuration’ в списке административных инструментов, Administrative Tools ). Ею и пользовались, рисунок 1.

Рисунок 1. Административная утилита конфигурирования Code Access Security

Интересно заметить, что до версии платформы 2.0 Mscorcfg.msc входил в .NET Framework redistributable package , с версии 2.0 и до 4.0 его перебросили в .NET Framework Software Development Kit (SDK) , а в версии 4.0 он попросту исчез отовсюду! Что с ним стряслось, и можем ли мы рассчитывать на его возвращение? Читайте статью далее.


Действия администратора в описываемой утилите называли «настройкой политик CAS ( CAS Policy )». По сути, такая политика декларирует, какой набор разрешений получит каждая из управляемых сборок на целевом компьютере. НО! Необходимо было учитывать, что существовало 4 уровня ( levels ) таких политик. На рисунке 1 мы можем видеть 3 из них – Enterprise , Machine , User , а «за кадром» осталась политика Application Domain . У каждого из уровней были, как это следует из того же рисунка, свои кодовые группы со своими, разумеется, условиями членства в них. Дальше каждая кодовая группа имела специфичный набор разрешений, а каждая сборка, опираясь на свидетельства, могла принадлежать к нескольким кодовым группам одновременно, что приводило к объединению всех их наборов в пределах данного уровня политики, а затем еще пересечению наборов между различными уровнями. Что такое? Чувствуете легкое головокружение? Это нормальное состояние при попытке мысленно охватить описываемый механизм. :) И это еще мы не упомянули о возможности назначить один из уровней политик «финальным» или, наоборот, «эксклюзивным». В общем – тяжелое было время. :)

Что даже еще хуже, так это тот факт, что все время и все усилия, затраченные администратором в окне оснастки консоли с рисунка 1 были направлены на настройку безопасности только управляемых ( managed ) приложений. Приложения неуправляемые Mscorcfg.msc вообще никак не затрагивал, да и затронуть не мог, ведь ядро функциональности CAS находилось (и продолжает) в среде исполнения CLR. Так что после настройки политик администратору рекомендовалось не расслабляться, а напротив – заняться тем же самым, но теперь для native -приложений Windows, с помощью отдельных инструментов, описание которых уж совсем выходит за рамки данной статьи. Кроме того, даже настройка только управляемых приложений через эту утилиту требовала от системного администратора если и не глубоких, то, по крайней мере, изрядных знаний по платформе .NET. То есть чтобы создать грамотную, продуманную, действительно безопасную политику, администратор должен был, по-хорошему, быть этаким универсальным “system-administrator-NET-developer”. Что, понятно, на практике встречалось нечасто…

Итого, какова же эффективность CAS-политик как инструмента безопасности? Квалификацию от персонала они требуют если и не высочайшую, то повышенную – точно. Трудоемкость реализации – значительна. Трудоемкость настройки на целевой машине – еще более значительна и усугублена ее обособленностью от настройки большинства других приложений (ведь на стандартном компьютере приложений .NET меньше, чем приложений обычных, неуправляемых). Все это привело к тому, что описываемая методология была скорее «витриной», нежели повседневным инструментом.

Code Access Security, продолжение

Итак, изменения в структуру и идеи безопасного кода просто напрашивались, если хотелось сделать этот компонент массовым продуктом, а не чем-то, применяемым только избранными «гуру» разработки. И в версии 4.0 эти изменения были, наконец-то, реализованы. В чем главнейшие отличия новой версии? Их два:

  1. В .NET 4.0 политики безопасности убраны совершенно (хотя такая сущность как разрешение , permission – оставлена).
  2. В .NET 4.0 механизм, который вынуждает код сборки обращаться только к разрешенным ресурсам (и препятствует обращению к ресурсам запрещенным), изменен с императивно/декларативного подхода на совершенно иную концепцию по имени Прозрачный для системы безопасности код , он же Security-Transparent Code .

Строго говоря, «новинка №2» не является таковой в полном смысле этого слова. Сама концепция была представлена еще в .NET 2.0. Но там это был скорее механизм внутренний, используемый по преимуществу самой Microsoft для написания кода базовой библиотеки платформы. Идея широко не освещалась, не продвигалась, и если вы впервые видите термин Security-Transparent Code в данной статье, то это неудивительно. Четвертая версия платформы эту идею существенно расширила и внесла в нее заметные коррективы. Чтобы отличать две эти «под-версии» прозрачного кода, тот вариант, что появился во 2 версии, назвали Security-Transparent Code, Level 1 , а тот, что в 4-й – Security-Transparent Code, Level 2 . Дабы статья не переросла в монографию и ее материал не был переусложнен нюансами технологий прошлых дней, мы вообще не будем касаться первого подхода, т.е. речь пойдет только о том варианте, что появился вместе с .NET Framework 4.0.

Какое практическое влияние на разработчиков и администраторов оказали эти две модернизации? По моему мнению, не побоюсь этого слова – колоссальное. У администраторов исчез из обихода Mscorcfg.msc , к которому они нежных чувств, мягко говоря, не испытывали. Теперь к их услугам инструмент Software Restriction Policies, а в самых последних версиях Windows (Windows 7 / Windows 2008 Server R2) его продвинутый аналог – AppLocker. Оба являются инструментами куда как более «администраторскими», нежели Mscorcfg.msc. А что еще важнее – и там, и там возможно конфигурирование как управляемого, так и неуправляемого кода! Правда, конфигурация управляемого кода построенного по концепции Security-Transparent Code, Level 2 практически и не требует вмешательства администратора. Все нюансы безопасности учитываются разработчиком при написании подобного кода. Причем и они, разработчики, от введения прозрачного кода только выиграли, т.к. планирование и реализация подсистем безопасности их приложений стало делом куда как более простым и понятным.

Резюмируем и подведем итоги этой краткой, но чрезвычайно важной части статьи. В модели безопасного кода .NET Framework версии 4.0 мы:

  • не используем политики безопасности и все сущности (см. раздел » Code Access Security, начало «), с ними связанные (за исключением permission и их наборов – эта сущность осталась);
  • используем модель «прозрачного кода» как стандартный путь защиты ресурсов компьютера.

С первым пунктом, полагаю, все ясно. Уменьшение сущностей – это то, к чему обязан стремиться любой разработчик, независимо от типа приложения, им создаваемого. Пусть это даже, как в нашем случае, платформа для разработки других приложений. Но – как нам теперь жить с одними только лишь разрешениями, и что такое, в конце концов, этот прозрачный код ? Вот здесь есть что обсудить.

Transparent Code

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

Механизм security transparency делит весь код, который только может быть создан разработчиком, на 3 понятных категории (или слоя, если хотите):

  • Код критический ( critical ) – полностью доверенный ( fully trusted ) код, способный делать абсолютно все, в т.ч. вызывать другой критический код.
  • Код прозрачный ( transparent ) – антипод предыдущего, может выполнять только безопасные операции (точное определение «безопасных операций» последует далее).
  • Код, критически важный для безопасности ( safe critical ) – пожалуй, центральная часть всей этой «прозрачной» идеи – снова fully trusted , могущий делать абсолютно все код, но главное назначение которого – служить мостом между кодом transparent и кодом critical . Т.е. первый не может напрямую обратиться ко второму, а лишь через посредника — safe critical код.

Иными словами имеем такую картинку, рис. 02:

Рисунок 2. Возможные обращения друг к другу кода разных слоев

Стрелочками на рисунке показаны все разрешенные обращения (т.е. вызовы кода) от слоя к слою, за исключением «внутри слоевых» вызовов, которые, разумеется, не имеют никаких ограничений. Сразу предупрежу, что не следует смешивать сборки ( assembly ) со слоями – это совершенно разные концепции! Да, зачастую в реальном решении весь код сборки будет принадлежать одному слою, однако в общем случае в одной и той же сборке код может представлять собой этакий «слоеный пирог», т.е. быть и критическим, и прозрачным, и safe critical. Это потому, что разграничение идет по классам, методам и даже полям класса. И обратное тоже верно – код одного слоя может быть «размазан» по многим сборкам.

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

Как технически разграничить код на эти 3 категории? Для этого используются атрибуты. Слоев (категорий) у нас сколько? Столько же будет и атрибутов:

  • SecurityTransparentAttribute – применяется только к сборке целиком и помечает весь ее код как прозрачный.
  • SecurityCriticalAttribute – применяется к сборке, классу, структуре, методу и даже отдельному полю. Разрешает указанной сборке/члену выполнение «опасных» операций.
  • SecuritySafeCriticalAttribute – возможные цели для применения те же, что и у предыдущего атрибута: класс, структура, метод и т.д. Но не сборка (см. далее)! Типы/члены, декорированные этим атрибутом, доступны для вызова из Transparent-слоя. В остальном аналогичен по действию предыдущему атрибуту. Код с этим атрибутом обязан крайне тщательно контролировать все данные, поступающие в Critical-слой из слоя Transparent, а также контролировать обратный поток данных. Собственно, именно аудит данных на пути из одного слоя в другой и является чуть ли не единственной задачей кода с этим атрибутом. Поскольку такой код должен быть редок (а желательно даже исключительно редок) то это единственный из трех рассматриваемых атрибутов, чье применение на уровне сборки запрещено.

Давайте уже разберемся в разнице полномочий critical- и transparent -кода. Что такого можно первому, чего нельзя второму? Список этих ограничительных операций не так велик. Transparent-коду нельзя:

  • утверждать (вызовом метода Assert() ) какие-либо разрешения или поднимать привилегии ( privilege elevation );
  • содержать небезопасный ( unsafe ) или неверифицируемый ( unverifiable ) код;
  • обращаться напрямую к critical коду;
  • вызывать неуправляемый код, а также код, декорированный атрибутом SuppressUnmanagedCodeSecurityAttribute
  • осуществлять хоть какое-то наследование от типов из critical-слоя;
  • перекрывать (overr >

Здесь и далее ссылка на код, рассматриваемый в данный момент дается как SolutionNN\ProjectMM , где NN/MM номер очередного решения и проекта в нем, соответственно. Не забывайте делать нужный проект текущим ( «Set as StartUp Project» в контекстном меню нужного проекта в окне Solution Explorer ). Весь код может быть загружен по ссылке в самом начале статьи.

Итак, Solution01\Project01 . Все наши эксперименты будут проходить на консольных приложениях, дабы мы могли сосредоточиться именно на вопросах безопасности. Первое из таких приложений является элементарным и просто вызывает (через механизмы interoperability) неуправляемую функцию GetVersion() . Изначально вся сборка помечена как critical, и никаких проблем при запуске не возникает. Теперь сделаем сборку «прозрачной», для чего закомментируем первый атрибут (строка 5) и раскомментируем второй (строка 6), т.е. приведем указанные строки к такому виду:

Вроде как все работает ожидаемо.

Хороший вопрос, который можно задать к этому моменту – а где во всей этой истории разрешения, которые permissions ? Ну да, определенному коду (сборке) нельзя выполнять «опасные» операции. А где «по-ресурсная» защита? Что, если мы хотим ограничить свой код так, чтобы он имел доступ к единственной папке на диске C:\, да еще только на чтение? Или то же самое для ключа реестра? Ведь даже прозрачный код имеет полный доступ к тому и к другому. Ну не входят эти ресурсы в список «ограничительных» операций! Что и доказывает Solution01\Project02 – «прозрачная» сборка творит на диске C:\ все, что захочет…

Или, что даже еще интереснее – а если нам принесли готовую управляемую .DLL с документацией по методам в ней содержащимся, но исходного кода у нас нет, а источник происхождения этой .DLL весьма туманен? Вот тут нам уже вообще никакие атрибуты не помогут, мы же не можем декорировать код, не имея исходников! Что тогда – мы не можем ограничить деятельность методов этой сборки отдельной папкой диска C:\?

Все возможно, но для этого нам предстоит ознакомиться с концепцией песочницы или, на языке оригинала, sandboxing . К этому и перейдем.

Sandboxing или игры в песочнице

Итак, нам со всей очевидностью требуется механизм, который займется раздачей прав «по-сборочно» и «по-ресурсно». Т.е. заменит собой те самые CAS-политики, раз уж их больше нет.

Новая концепция безопасности предлагает такой механизм в виде гомогенного (т.е. однородного) домена приложения ( homogeneous application domain ). Что такое домен приложения? Да в принципе хорошо нам знакомый AppDomain. А давно ли он стал homogeneous и каким он был до того? Стал недавно, с версии 4.0, а до этого был, очевидно, противоположным – гетерогенным (разнородным, heterogeneous ). Разница в этих двух типах доменов сводится к тому, что в разнородный домен можно было загрузить сколько угодно сборок, но каждая из них могла обладать своим набором прав, который назначался (кстати – в момент загрузки сборки!) CAS-политикой. А в однородный домен можно загрузить сколько угодно сборок, но каждая из них будет обладать идентичным набором разрешений. Ровно тем, что «присвоена» самому домену. И вот такой-то «унифицированный» в вопросе разрешений домен и называют песочницей. Или sandbox , кому как нравится.

А вот непосредственно описание метода, создающего такие песочницы:

Смысл параметров такой:

  • friendlyName — описательное имя песочницы, а фактически домена.
  • securityInfo — свидетельство (evidence), сопоставляемое с доменом приложения. Этот параметр не используется для разрешения CAS-политики, как было во FW 1.x-3.x, а лишь хранит информацию типа сведения об издателе; очень часто (и даже почти всегда, см. далее) вы будете передавать в этом параметре null , дабы в новой песочнице использовались свидетельства текущего домена.
  • info — инициализирующая информация для песочницы. Вней должно быть заполнено, как минимум, значение свойства ApplicationBase, представляющее путь к частично доверенным сборкам. Иными словами, когда позже на уже готовом домене мы вызовем метод Load() , поиск сборки, подлежащей загрузке, будет выполняться именно в этой папке.
  • grantSet — набор разрешений для всех загружаемых в этот домен сборок, кроме двух особых случаев, разбираемых далее.
  • fullTrustAssemblies — первый из особых случаев, разбираемых далее.

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

Еще раз. Все и любые сборки (два особых случая пока опускаем), загруженные в домен-песочницу, получают разрешения этой песочницы, только разрешения этой песочницы, и ничего кроме разрешений этой песочницы. И никакими ухищрениями это правило не обойти. Точка, end-of-story.

К этому моменту должен родиться следующий правильный вопрос. Пусть у нас есть основное приложение Console.exe и библиотека Lib.dll. Согласно только что описанному краеугольному правилу раздачи прав мы можем хоть первой же строчкой кода exe-приложения создать песочницу, ограничить ее в правах, загрузить туда Lib.dll и спокойно с ней работать. Все выглядит великолепно, не понятно только – а кто для Console.exe песочницу-то создаст? И права ей назначит? И вот тут мы подходим к концепции хостируемых ( hosted ) и нехостируемых ( unhosted ) управляемых приложений.

Хостируемое приложение загружается в любезно подготовленный кем-то домен-песочницу и исполняется в нем. Кто и что может выступать в роли этого «кого-то»? Да почти что угодно: ASP.NET run-time, SQL CRL run-time, браузер IE, наша Console.exe в конце концов…

А нехостируемое приложение поступает «на разбор» непосредственно CLR, им же загружается и им же запускается на выполнение.

Итого, в нашем примере, как все уже догадались, Console.exe – unhosted, а Lib.dll – hosted приложение.

Строго говоря, любое управляемое приложение, запущенное пользователем будет unhosted . Домен ему будет предоставлен средой исполнения. А какие разрешения будет иметь этот домен? Ну – с этим совсем просто: он будет иметь все разрешения. Без исключения. Так как unhosted-приложение есть суть приложение с полным доверием ( full trusted ). А вот те библиотеки (более формально – сборки), что главное приложение подгрузит по ходу своей работы, могут быть как unhosted (если приложение не будет заморачиваться песочницами и просто загрузит их в свой же домен; кстати – физическое расположение библиотек на диске/в сети не будет играть никакой роли, важен лишь целевой домен их загрузки), так и hosted (если песочница все же будет создана). В первом случае библиотеки станут вновь полностью доверенными, во втором – частично доверенными ( partially trusted ). У полностью доверенных приложений есть лишь один шаблон обладания правами – обладать ими всеми без исключения. У частично доверенных приложений будет почти бесконечное множество сочетаний тех прав, которыми они обладают, но у всех этих наборов будет одна характерная черта – они все будут не полными . А иначе такое приложение автоматически перейдет в категорию full trusted, не так ли? Можно сказать, что на концептуальном уровне новый механизм оставил всего 2 permissions set: полный набор (full) и не полный набор (partially).

ПРИМЕЧАНИЕ

Если вы спросите меня – «а что, если в Windows Explorer зайти на local network share и двойным щелчком запустить приложение оттуда – неужто и оно запустится как full trusted?» – то я отвечу утвердительно. Именно как full trusted такое сетевое приложение и запустится. Правильно ли это? Ну, автор этих строк полагает что да, пожалуй, все верно. По сути, момент запуска приложения – это вопрос доверия запускающего его пользователя программисту/издателю этого приложения. Не знаешь? Не уверен? Не запускай. А вот если доверие программисту есть, то пользователь выражает уверенность, что все будет хорошо, вне зависимости от того, где сборка расположена. Разумеется, этот «аттракцион неслыханной щедрости» раздачи прав не действует в случае Internet Explorer (иначе это был бы уже диагноз :) ). Все, что попытается запуститься в IE, будет запущено в песочнице. Как уже было замечено выше, IE – это один из «хост-провайдеров» или «строителей песочниц», и осмотрительно запускает все, что запрашивает пользователь, в среде с сильно усеченными правами.

Давайте снова займемся программированием, Solution01\Project03 . Мы хотим узнать о нашей сборке две вещи:

  • место ее «происхождения»;
  • является ли она полно или частично доверенной.

ПРИМЕЧАНИЕ

Возможно, в свете вышесказанного, вы удивитесь тому, что свидетельства (evidences) все еще остались при новой модели безопасности. Ну ладно раньше, когда они были неотъемлемой частью CAS-политик… Но сейчас? Зачем они нужны? Кто их анализирует? Выясняется, что никто их не анализируют, никакого влияния они на раздачу прав они не оказывают (в чем мы сейчас прямо и убедимся), а оставлены, надо полагать, разве что с целью обратной совместимости.

Код снова элементарен и не требует никаких комментариев, поэтому просто запускаем и видим:

Все более чем ожидаемо. А теперь поступим так: создадим любую папку (скажем C:\MyShare), откроем к ней общий доступ, скопируем в нее Project03.exe из текущего проекта, в Windows Explorer перейдем по адресу \\ \ и двойным щелчком по программе Project03 запустим ее на выполнение еще раз. Видим:

Что и требовалось доказать. Отныне есть лишь один критерий назначения набора разрешений коду: тот домен, куда код (сборка) загружается и разрешения этого домена . У нас в обоих случаях домен создавался непосредственно CLR, или, что эквивалентно, мы имели дело с unhosted-приложением, что означает, что нам полностью доверяли.

А теперь – вместе

К этому моменту мы бегло рассмотрели два механизма нового подхода к безопасности кода:

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

Идея «слоеного кода» состоит в «покомандной» защите. Мы препятствуем коду выполнить набор опасных команд (см. перечисление выше). При этом защита ресурсов (папок, файлов, реестра и т.п.) нас вовсе не интересует. Поясним сказанное примером, Solution01\Project04 . На этот раз наше приложение Project04.exe будет вызывать метод из другой сборки – Project04_Lib.dll . Легко заметить, что изначально обе сборки помечены как SecurityTransparent , что совершенно не мешает им обратиться к довольно чувствительному месту системы – реестру. Это потому, что они обе полностью доверенные. Теперь мы решаем, что метод ReadReg() библиотеки Project04_Lib.dll должен принадлежать к списку «опасных команд», и помечаем его атрибутом SecurityCritical , убирая комментарий из строки 11 и одновременно комментируя для этой сборки атрибут assembly: SecurityTransparent , т.к. сборка не может быть прозрачной, если в ней есть хотя бы 1 непрозрачный член. Запуск измененного проекта приводит к исключению:

При этом обе сборки остались полностью доверенными! Но — «опасная операция», и как следствие — искусственная преграда платформы для вызова критического кода из кода прозрачного. Кстати говоря, чтобы восстановить работоспособность примера, можно, конечно, проделать две обратные операции над атрибутами в коде библиотеки Lib.cs . Но можно и в коде приложения ( Program.cs ) просто закомментировать атрибут assembly: SecurityTransparent . Это приведет к исчезновению прозрачного кода как такового, а значит, и список опасных команд потеряет свою актуальность. И давайте еще проясним такой вопрос – а каким будет код в сборке, не помеченной никаким из трех возможных атрибутов, определяющих принадлежность тому или иному слою? Как раз ситуация после нашего последнего редактирования файла Program.cs .

Итак, если сборка не помечена никаким из трех атрибутов безопасности:

  • При загрузке подобной сборки в домен-песочницу и, как следствие, интерпретации ее системой как partially trusted – код в ней становится по умолчанию прозрачным ( transparent ) со всеми вытекающими.
  • Если же сборка грузится в любой домен как полно доверенная – код в ней становится критичным ( critical ), за исключением тех случаев, когда назначение кода как принадлежащего critical-слою нарушит правила наследования.

Я не зря выделил во втором правиле слово «любой». Постоянно держите в голове, что сборка, загружаемая в песочницу, обычно становится частично доверенной. Однако есть два исключения (добраться до разбора которых нам все еще мешают первоочередные вопросы), при которых сборка и в таком домене будет полно доверенной. Тогда правило №2 будет относиться к ней в полной мере.

Вот и объяснение наблюдаемому: после удаления атрибута из Program.cs сборка Project04 стала critical и смогла без проблем вызвать не менее critical метод ReadReg() .

Если бы весь существующий в мире .NET-код был нашим и доступным нам в исходниках, на этом можно было бы ставить точку. Описанный механизм – это все, что нам нужно. Предположим, мы создали метод WriteToCFolder() для записи файлов в C:\Folder и считаем, что этот метод потенциально опасен? Пометили его SecurityCritical . Пишем WinForms-приложение и уверены, что ему нечего делать в C:\Folder? Соответственно, во-первых, сами не программируем его таким образом, а во-вторых, для страховки еще и помечаем как SecurityTransparent . После этого вызвать метод WriteToCFolder() у нас не получится никак, ни умышлено, ни по неосторожности. Пишем Web-сервис, который может обратиться к WriteToCFolder(), но очень «осторожно», так как требуется соблюдение ряда условий? Помечаем и его как SecurityTransparent , и дополнительно создаем метод WriteToCFolder_Proxy(), который помечаем атрибутом SecuritySafeCritical . Напрямую сервис к «опасному» методу не обратится, а поток данных через «прокси» будет этим самым прокси же и контролироваться, как и соблюдение входных условий. Кстати, код из этого (safe critical) слоя стоит особняком от своих «коллег». Если transparent / critical это, по большому счету, обычный рабочий код (первый – с рядом ограничений, а второй – просто обычный, без всяких оговорок), то safe critical-код:

  • Должен быть редок (а желательно даже исключительно редок).
  • Заниматься исключительно контролем данных, поступающих в critical-слой из transparent-слоя. Обратный контроль тоже не возбраняется.
  • Писаться и тестироваться тщательнее, чем код двух других слоев. Помните, что это именно те «ворота», что открывают transparent-коду мир неограниченных возможностей. По счастью, если пункт 1 соблюден, выполнить это предписание несложно.

Однако, в силу того, что изрядная часть кода нашего приложении приходит «со стороны» (в конце концов, даже Base Class Library самого Framework – уже не наш код) и, как следствие, без исходников, мы вынуждены брать на вооружение идею песочницы. В этом случае нет опасных операций, а есть критичные (или, кстати, если хотите, снова «опасные») ресурсы, то есть это подход, защищающий ресурсы и работающий для любого кода. Даже сборки из Base Class Library будут эту защиту «уважать» (однако снова напоминаю о двух особых случаях, см. далее). И с первым механизмом этот практически не связан, если не брать связь косвенную, возникающую в случае без атрибутных сборок. А так мы можем в нашем коде применять любой из подходов поодиночке, комбинировать их, а также не пользоваться ими вовсе (хоть это и будет несколько обидно – для чего я тут стараюсь? :) ). Справедливости ради замечу, что абсолютный отказ от обоих механизмов невозможен. Даже если мы написали консольное приложение класса “Hello World”, и ничего не знаем о материях, изложенных выше – то уже такой код элементарной сборки становится critical (заодно проверьте себя – можете ли вы объяснить, почему это будет именно так), а значит, механизм №1 уже включен. Другое дело, что чисто критический код лишен какого либо смысла в плане безопасности, смысл появляется, когда он начинает комбинироваться с прозрачным и safe critical-кодом. Но чисто технически механизм все же будет включен. Помните – код .NET 4 всегда «лежит» в одном из слоев, без исключений.

Строим замки. Из песка

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

Давайте сразу приступим к коду и сосредоточимся на проекте Solution01\Project05 . Этот проект состоит из основной консольной программы, а также из проекта вспомогательного, Solution01\Project05_Lib . Соответственно, файл Program.cs из первого проекта содержит код приложения, Lib.cs из второго – код библиотеки. К чему будем стремиться: чтобы приложение было загружено CLR в главный домен (я буду условно ссылаться на него как MAIN domain ), чтобы оно создало домен вспомогательный, с ограниченными правами ( SANDBOX domain ), и чтобы библиотечный метод ReadReg() был выполнен именно в последнем. Ввиду далеко не тривиального кода, особенно для сталкивающихся впервые с песочницами, разберем код обоих файлов достаточно подробно.

Прежде всего, обращает на себя внимание, что класс приложения объявлен наследником класса MarshalByRefObject . Этот потому, что стратегия достижения поставленной задачи у нас будет такая:

  • создать домен-песочницу (SANDBOX domain) ;
  • загрузить в него ту же самую сборку, содержащую код приложения, т.е. Project05.exe ;
  • передать управление ей, чтобы этот, второй экземпляр, сборки, вызвал метод ReadReg() библиотеки уже внутри песочницы.

Очевидно, в последнем пункте неизбежно пересечение границ домена ( AppDomain boundaries ), что достижимо только через механизм маршаллинга ( marshalling ), который и включается указанным наследованием.

Первое что мы делаем – пытаемся распечатать главную информацию по стартовому домену, MAIN domain . Нас интересует:

  • Является ли домен полно доверенным или нет. Обратите еще раз внимание, что разрешения и их наборы теперь выдаются не методам, не сборкам, а доменам !
  • Какие сборки в него загружены.
  • Для каждой загруженной сборки:
  • ее простое имя;
  • является ли она полно доверенной или нет; если вы считаете, что после запроса первого пункта этот теряет смысл, т.к. попросту дублирует его, то я вас поправлю: обычно дублирует, но в общем случае – нет (далее мы увидим, как эти два показателя могут различаться).
  • Является ли текущий код принадлежащим transparent- или critical-слою.

Возьмите себе на заметку свойства IsSecurityTransparent, IsSecurityCritical, IsSecuritySafeCritical класса Type . Во многих случаях они помогут вам разобраться с неочевидными моментами при работе с новой системой безопасности.

Переходим к формированию песочницы. Первое, что нам потребуется – настройка будущего домена, а в ней, как минимум, один параметр: путь к загружаемой сборке. В нашем случае такая сборка ( Project05_Lib.dll ) «лежит» рядом с основной программой ( Project05.exe ).

Центральная часть нашего кода – определение набора разрешений, которые будет иметь новый домен и все сборки, в него загруженные. Начинаем, как положено, с совершенно пустого набора.

Со временем мы добавим в этот набор пару разрешений. Однако пока сборкам нельзя будет делать в таком домене абсолютно ничего.

Непосредственно создаем новый домен. Обращу ваше внимание на то, что метод AppDomain.CreateDomain() имеет 6 перегрузок, из которых для изготовления песочниц годится один(!) – с параметром PermissionSet в подписи. Только он готов назначить новому домену набор разрешений, а это – ядро нового подхода.

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

По идее, можно передать evidence, т.е. свидетельство. Однако, как подсказывает старый-добрый .NET Reflector, вы можете передавать в этом параметре что хотите, на обработку уйдет все равно null . :) Оно и понятно – некому больше анализировать свидетельства, политики-то закончились…

Настройки домена с, как минимум, путем к загружаемым библиотекам.

О важности и уникальности этого параметра было сказано только что.

К этому моменту новый домен создан. Мы переходим к загрузке в него той сборки, функциональность которой нам требуется. Нам нужен экземплярный метод RunMeInSandbox() (см. ниже) класса Program , для чего мы в новом домене создаем экземпляр указанного класса и сразу же получаем в главном домене прокси к этому экземпляру, дабы иметь возможность им управлять. Параметры создания удаленного объекта p :

  • appDomain – целевой домен;
  • «Project05» — сборка с классом Program ;
  • «Project05.Program” — полноквалифицированное имя этого класса.

И – кульминация, вызов метода в соседнем домене. Как мы знаем p – это прокси к удаленному объекту, а значит указанный метод RunMeInSandbox() выполнится именно в песочнице, а не в MAIN domain !

Собственно – первая строка метода RunMeInSandbox() и есть тот код, с которого начнется работа вспомогательного домена. Какова функциональность указанного метода (а точнее, его единственной строки), станет ясно из разбора файла исходного кода библиотеки.

Мы видим, что вся деятельность метода, которым мы только что завершили разбор кода файла Program.cs, сведется к вызову указанного метода из сборки библиотеки. Разумеется, для этого последняя должна будет загрузиться в какой-то домен. По умолчанию загрузка пойдет в тот домен, из которого произошел вызов, а, стало быть – в SANDBOX domain . Не менее само собой разумеющимся представляется факт, что вызов RunMeInSandbox()->Project05_Lib.Lib.ReadReg() будет локальным , т.е. случится полностью в границах упомянутого домена.

Посмотрим, что делает библиотека.

Совершенно аналогично одноименному методу предыдущего файла, только по отношению к SANDBOX domain .

Пробуем выполнить операцию запрещенную, по идее, в рамках не уполномоченного на то домена.

Получилось? Рапортуем об успехе!

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

При запуске Project05.exe из Visual Studio 2010 рекомендую пользоваться пунктом меню Debug->Start Without Debugging или, что проще и эквивалентно, нажать Ctrl +F5. Это позволит видеть в консольной распечатке только реальных «участников спектакля». При запуске по F5 в целом поведение не изменится, но Visual Studio подгрузит в домены еще порядка 5-7 совершенно не интересных нам сборок для поддержки своей инфраструктуры. Далее весь вывод тестовых прогонов приводится для рекомендуемой методики запуска.

Ага, получили исключение. Жмем Close the program в окне сообщения об ошибке и, игнорируя частичный вывод нашей программы в консоль, сосредоточимся на информации об исключении:

Анализируем. Вроде как сообщение намекает нам, что есть такой Execution permission , которого у нас нет? Да – все верно. Даже если сборке нужно в новом домене выполнить только сложение двух целых, уже находящихся в регистрах CPU (я уж молчу про такие «крупномасштабные» операции, как вывод на консоль), ей УЖЕ требуется разрешение. Причем именно то, на которое жалуется исключение. OK – предоставим, для чего уберем один комментарий со строки 18 файла Program.cs . Ctrl+F5 и получим новое исключение, на этот раз:

Ну, тут-то без вопросов. Как мы и ожидали, для доступа к реестру нужно свое разрешение. В нашем случае требуется, как минимум, разрешение на чтение ключа \\HKEY_CURRENT_CONFIG\ и его подключей. Дадим и его, убирая комментарий со строки 19 того же файла. Ctrl+F5 и – полный успех! Осталось проанализировать вывод на консоль:

В наш главный домен, который, безусловно, является полно доверенным, загружены две сборки:

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

Сборка нашего консольного приложения. Тоже полностью доверенная, тоже без вопросов.

Код, исполняемый в текущий момент, т.е. код класса Program , является критическим. Верно, мы же никаких атрибутов безопасности не применяли.

Новый домен. Песочница. Уже НЕ полностью доверенный – это хорошо.

Снова ядро системы. И снова полностью доверенная?? В частично доверенном домене? Такое возможно? Так, а я вас предупреждал! Пока примем как факт, а к механике процесса обратимся позже.

Снова сборка нашего приложения, т.е. содержащая Project05.exe . Однако на этот раз – частично доверенная! Как вам? Одна и та же сборка, в одном и том же процессе (не путаем процессы и домены, OK?), в течении одной и той же сессии исполнения имеет различные привилегии! По-моему — гениальная задумка. :)

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

По той же причине, что ранее привел к помещению кода класса Program в критический слой, код класса Lib поместился в слой прозрачный.

Ну и наконец – чтение ключей реестра кодом, который, фактически, только это и может сделать. Поползновения на доступ к файловой системе или попытки установить соединение с SQL Server будут неуклонно пресекаться. Только и именно чтение, только указанного ключа. И еще раз заметьте – код библиотеки в нашем примере мало того что крайне ужат в дозволенной функциональности, так он еще и прозрачен. И после этого кто-то будет утверждать что .NET Framework 4.0 потерял в стойкости защитных механизмов?

Но что, если библиотеку нам принесли «со стороны», в виде готовой .dll, а ее автор был настолько хитроумен, что догадался снабдить свою сборку атрибутом SecurityCritical? Не пойдет ли прахом только что выстроенный и кажущимся таким надежным барьер вокруг ненадежного кода? Ведь если библиотеке удастся стать critical, она сможет вызвать «наши» методы, т.е. код класса Program !

Проверим. Встанем на место такого «продвинутого» писателя библиотек и уберем комментарий со строки 6 файла Lib.cs .

ПРЕДУПРЕЖДЕНИЕ

Мини-тест 1: не запуская отредактированный вариант проектов Project05 / Project05_Lib предсказать его поведение. Что будет напечатано (если вообще будет) на консоли?

Надеюсь, что к этому моменту ответ на тестовый вопрос будет для вас если и не очевидным, то уж задуматься на очень долго не заставит. Ну и конечно, давайте нажмем Ctrl+F5 и проверим себя. Да, как и ожидалось, абсолютно никаких изменений. Вывод на консоль совершенно идентичен только что проанализированному. Более того, исполняющая среда попросту игнорирует всю «слое-безопасную» атрибутику любой частично доверенной сборки! Только fully trusted-сборки могут «двигать» свой код между слоями. Partially trusted-сборки со всем своим содержимым трактуются как прозрачные, только прозрачные, и никогда иначе.

Вносим сумятицу. Полно доверенные сборки в частично доверенных доменах

Пришло время разобрать тонкий момент, который автор упоминал снова, и снова, и снова по ходу изложения материала, а именно: почему возможна ситуация, когда домен – частично доверенный, а сборка, в него загруженная – пользуется полным доверием? Но сначала краткое вступление в тему на предмет, зачем вообще оставили такую «лазейку» вместо тотального затыкания всех “back-doors”.

Возьмем для примера последний из разобранных проектов, Solution01\Project05(Project05_Lib) . В нем, как вы помните, основная сборка Project05.exe успевает побывать «единой в двух лицах» — и как полно доверенная сборка в основном домене, и как сборка с частичным доверием в песочнице. С первым все ясно, а со вторым может быть и «напряг» – что, если указанная сборка действительно должна иметь полные права для своей нормальной работы и при этом я, как ее автор, конечно же, доверяю ей безоговорочно? Тогда, если мне придется загрузить ее в частично доверенный домен, как в нашем случае, мы будем иметь несколько искусственное ограничение, во-первых (к чему ограничивать на 100% безопасную сборку?), и просто потеряем нужную нам функциональность, во-вторых. Кроме того, есть сборки (та же mscorlib.dll ) которые просто обязаны быть полно доверенные в любом домене, опять же по причине возможности потери части своего функциональности со всеми вытекающими.

Вступление завершено, нам предстоит научиться пользоваться означенной возможностью, а заодно выяснить – почему это mscorlib.dll (и не только она, заметим) сама пользуется ею, не требуя от нас никакого «тюнинга» в этом вопросе?

Итак, формально говоря, есть 2 пути загрузить сборку в любой домен как полно доверенную, фактически игнорируя права этого домена. Разберем с помощью проектов Solution01\Project06(Project06_Lib) путь первый.

Указанная пара проектов дублирует предыдущую пару, в том виде, как мы ее оставили, т.е. с доменом-песочницей, имеющей всего пару разрешений. Отличие лишь одно, и код как таковой оно совершенно не затрагивает, т.к. сводится к подписыванию обоих проектов своими парами ключей. Как вы, несомненно, знаете, это означает, что обе сборки обзавелись строгими именами ( strong name ). Однако запуск проектов на исполнение не выявляет никаких дивидендов от такого строгого имени. Все работает, но вывод на консоль совершенно аналогичен выводу последнего испытания предыдущей пары проектов: в частично доверенном домене все сборки (за исключением mscorlib.dll ) являются точно такими же с точки зрения доверия к ним. Т.е. пока отличий ровно никаких.

Что ж – давайте теперь выполним несложную операцию и поместим сборку нашей библиотеки Project06_Lib.dll в глобальный кэш сборок, больше известный по своей аббревиатуре GAC . Для этого я на своей машине выполнил такую команду в Visual Studio Command Prompt (2010) :

И проверил факт успешной инсталляции сборки в GAC:

Все отлично, возвращаемся в студию и без всяких перекомпиляций (код-то мы не меняли) жмем Ctrl+F5. Хмм…

ПРЕДУПРЕЖДЕНИЕ

Мини-тест 2: попробовать объяснить наблюдаемое. Далее приводится ответ, так что если вы хотите проверить себя – поставьте чтение статьи «на паузу», запишите свой вариант ответа, а затем сравните с объяснением автора.

На текущем этапе разбора новых механизмов безопасности ‘Мини-тест 2’ будет довольно заковырист, ответить на него правильно можно только по косвенным намекам в нескольких предыдущих абзацах…

Итак – верный ответ. Во-первых, какая именно сборка библиотеки теперь была загружена в песочницу? Была загружена именно GAC-сборка. То, что ее копия «лежит» рядом с Project06.exe, ровным счетом ничего не меняет, грузится именно GAC-вариант – он приоритетен с точки зрения CLR. Во-вторых (самое главное), с каким доверием была загружена эта GAC-сборка? Вот тут как раз и выясняется – с полным , то бишь fully trusted . Это все потому, что любая сборка из глобального кэша в любом домене имеет неограниченные права. Прояснилась для вас «магия» mscorlib.dll? Считаю только что описанный принцип оправданным на все 100%. В нормальных условиях сборка, которой мы не доверяем хотя бы в малом, не может очутиться в столь… кхм, «интимном» :) месте нашей машины. Ясно, что уж кому-кому, а GAC-сборкам мы верим без оглядки. Тогда к чему контроль за ними? Однако продолжим и заметим, что со сборкой Project06.exe вообще ничего нового не происходило – как она грузилась в песочницу partially trusted, так и продолжает. А тогда, в-третьих, в каких «слоях» окажутся в песочнице коды приложения и библиотеки? По причинам, изложенным ранее, код первого будет transparent, а второго – critical. И, наконец, в-четвертых – что мы имеем при попытке вызвать второе из первого (именно это происходит при вызове из RunMeInSandbox() библиотечного метода Lib.ReadReg() )? Да именно то, что наблюдаем!

Как же нам восстановить работоспособность примера? Наиболее релевантным для нашей текущей темы будет путь загрузки и приложения тоже как fully trusted сборки. Тогда, как вы понимаете, обе сборки станут critical и договорятся друг с другом без проблем. Что ж, давайте реализуем. Вообще-то, можно было бы и Project06.exe «затолкать» в GAC. И кстати, знаете ли вы, что начиная с .NET версии 2.0 исполняемые модули без проблем размещаются в кэше? Но это будет выглядеть странно, совершенно нетипично и, что важнее, не прольет свет на второй способ достижения полного доверия в домене с доверием частичным. А посему мы выберем совсем иную реализацию.

Дело в том, что разбирая реальные примеры создания песочниц методом CreateDomain() , мы до сих пор совершенно игнорировали его последний параметр – fullTrustAssemblies . Поскольку данный параметр имеет модификатор params , то при вызове метода его можно просто не указывать, что эквивалентно передаче в нем значения new StrongName[0] . Именно так мы и поступали. Однако пришел и его черед. Как явственно следует из декларации параметра, он ждет от нас массив строгих имен сборок. Благодаря наличию метода Evidence.GetHostEvidence (), появившегося очень кстати в .NET 4.0, извлечение требуемого из загруженной сборки может быть выполнено в одну команду. Скажем, строгое имя текущей сборки получить очень просто:

Давайте передадим массив из одного строгого имени нашего приложения, для чего раскомментируем строку 27 файла Program.cs . Запускаем – полный успех!

Осталось проанализировать вывод на консоль. Для главного, стартового, домена не изменилось абсолютно ничего, все и вся выполняются с полным доверием, кругом critical-код. А вот для песочницы…

Домен по прежнему НЕ полно доверенный!

Здесь без изменений, ядру – полное доверие всегда!

Наше приложение, загруженное в домен без Full Trusted, исполняется в нем как полно доверенное!

ACCESS 2010 System Resource Exceeded

My team were working with access 2000, where we have our MDB project. This application(ERP) could open around 20 access forms. After we decide migrate our entire system to Access 2010 to its new format, *.accdb; we are having this trouble with less memory, around 100mb nowadays.

Is there any workaround, any path i could follow to increase my access 2010 project memory limit.

Problem’s Flow: We put login and password in the initial form, and start opening forms(form from access forms, literally). When around 10 forms, the memory used by acess 2010 reachs 107mb, and when we open the next form, the system crash with the following error: «3035 Description System resource exceeded»

4 Answers 4

The issue is caused by 32 bit Access exceeding the 32 bit windows Virtual Memory limit of 2GB per app. I don’t know why this issue does not crop up on Windows XP (didn’t have time to test it).

You can track VM usage either through Performance Monitor or through code in the access app. You will see that as forms open the VM usage creeps up until access balks.

The solution is to switch to Access 64 bit on windows 64bit. Keep in mind that if you have external dll calls they need to be rewritten for 64 bit. Also ActiveX controls need to be 64 bit.

Code to track VM

Building off of the VM tracking code provided by Mint, I’ve made a sort of ‘Early warning’ system for my application that warns you when the VM is approaching a point where it’ll start causing problems and recommend a reboot. It’s slightly annoying, but until someone comes up with a better solution to 32-Bit Office running in a 64-Bit OS environment, it’ll have to do.

ReturnVM: Returns the Virtual Memory usage in GB, triggers alert if it’s over 1.425GB. I’ve found that this works for my application giving as much time between restarts while still allowing some leeway to finish work before restarting. Feel free to adjust as needed.

os_Restart: Writes a batch file that kills the active Access process, deletes the leftover laccdb file and restarts the application (provided everything’s on the user’s desktop). After writing the file, it executes the batch. Another function deletes this file on application start.

Илон Маск рекомендует:  Псевдокласс last-of-type
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL