Информационная безопасность

         

Windows и Delphi на защите секретов (часть 4)


Константин Виноградов,

Первые три части статьи

Что такое сертификат? Какова его роль в защите информации? И, самое главное, - как можно использовать на практике механизм сертификации? Об этом и пойдет речь в нашей статье

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

Сертификаты

Представим себе, что существует организация, которой Боб полностью доверяет. Назовем ее Центром сертификации (Certification Authority). Алиса отсылает свой открытый ключ в Центр сертификации (ЦС). Там у нее запрашивают документы и устанавливают, действительно ли она та особа, за которую себя выдает. Затем ЦС генерирует электронный документ, содержащий информацию об Алисе и ее открытый ключ, и подписывает его своим закрытым ключом. Этот цифровой документ и является сертификатом. Сертификат может не только служить для аутентификации личности (как в случае с Алисой), но и подтверждать подлинность оборудования, веб-сайта, организации и т.п. Поэтому набор сведений, входящих в его состав, может изменяться и удовлетворять одному из стандартов.

Как правило, сертификат содержит следующие данные: серийный номер сертификата;

ФИО (название) владельца сертификата;

открытый ключ владельца;

срок действия (даты начала и конца пригодности сертификата);

название ЦС;

электронная цифровая подпись ЦС.

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

Поскольку сведения об Алисе подписаны, Боб может убедиться в их целостности. Для этого ему нужно обратиться в ЦС и проверить цифровую подпись, входящую в состав сертификата. Даже если Ева, о который мы упомянули вначале, перехватит сертификат и изменит сведения об Алисе, то ей придется подделывать подпись ЦС.
Кроме того, Боб тоже может получить в ЦС "электронное удостоверение личности" - и тогда уверенностью в подлинности открытых ключей будут обладать оба корреспондента. Остался один невыясненный вопрос: на чем держится доверие к Центру сертификации? Если Алиса и Боб - сотрудники одной и той же организации, а переписку ведут в деловых целях, то в качестве ЦС может выступить сама организация. Для этого ей потребуется обзавестись штатным специалистом по защите информации и поручить ему выполнение всех процедур, связанных с выдачей и проверкой сертификатов. Ну а на чем должно основываться доверие фирмы к своему сотруднику, думаем, объяснять не нужно. В случае же, если Алиса и Боб - представители различных организаций, им придется обращаться в независимый центр сертификации. Деятельность таких центров, как правило, лицензируется службами безопасности страны или другими государственными органами. Например, украинские организации, работающие в сфере защиты информации, должны получить лицензию СБУ. Сертификату, выданному таким ЦС, можно доверять в той же степени, в какой вы доверяете паспорту гражданина некого государства. Центры сертификации могут находиться в различных странах, работать с различным программным обеспечением, поддерживать разные стандарты сертификатов и отличающиеся процедуры их выдачи. Поэтому возникает необходимость наладить отношения доверия между самими ЦС. Эта система доверительных отношений может строиться по иерархическому принципу. Существует небольшое число ЦС, называющихся корневыми (Root Certification Authority). Они удостоверяют сертификаты дочерних центров, которые, в свою очередь, подтверждают подлинность других ЦС и т.д. В глобальном масштабе структура ЦС представляет собой несколько иерархий (см. ). Поддержка сертификатов в CryptoAPI

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


Никто ведь не может запретить вам обмениваться файлами, которые по секрету от СБУ вы будете считать цифровыми документами. Чтобы обзавестись собственным сертификатом, прежде всего нужно создать запрос специального формата, который должен содержать ваше имя, открытые ключи обмена ключами и подписи. Этот запрос подписывается отправителем при помощи личного закрытого ключа и отсылается в центр сертификации. Запрос на получение сертификата

Рассмотрим процесс создания запроса более подробно. Для хранения данных запроса в CryptoAPI предназначена специальная структура - CERT_REQUEST_INFO. Она содержит ссылки на другие структуры, хранящие имя владельца сертификата, информацию об открытых ключах и, возможно, некоторые дополнительные атрибуты (). В результате для создания запроса сертификата следует выполнить следующие шаги: Создать строку, содержащую поле Subject сертификата.

Создать массив структур CERT_RDN_ATTR (в простейшем случае он будет состоять из единственного элемента) и инициализировать каждый его элемент следующими данными: строкой идентификатора объекта, типом хранимого значения, длиной строки, созданной на первом шаге, и самой этой строкой, приведенной к типу PBYTE. Аббревиатура RDN означает Relative Distinguished Name (относительные отличительные признаки). Структура RDN может хранить, например, имя пользователя, адрес, страну, наименование подразделения организации и т.п. При этом хранимые данные характеризуются идентифицирующей строкой: скажем, имя владельца сертификата должно иметь строку-идентификатор "2.5.4.3", двухбуквенный код страны - "2.5.4.6", и т.д. (подробное описание можно найти в справке по CryptoAPI). Способ представления данных строки описывается типом хранимого значения - например, CERT_RDN_PRINTABLE_STRING или CERT_RDN_ENCODED_BLOB.

Создать массив структур CERT_RDN (в простейшем случае и он будет содержать лишь один элемент) и инициализировать каждый его элемент количеством элементов в соответствующем массиве CERT_RDN_ATTR, созданном на шаге 2, и ссылкой на первый элемент этого массива.



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



Вызвать функцию CryptEncodeObject, передав ей в качестве соответствующего параметра структуру CERT_NAME_INFO из шага 4. Результатом работы функции будет структура типа CERT_NAME_BLOB, содержащая входную информацию в закодированном виде. При обращении к функции следует указать тип кодировки; документация по CryptoAPI рекомендует использовать кодировку в виде комбинации следующих констант: PKCS_7_ASN_ENCODING or X509_ASN_ENCODING (другие типы могут не поддерживаться).

Записать в поле Subject структуры CERT_REQUEST_INFO ссылку на структуру CERT_NANE_BLOB, созданную и инициализированную на шаге 5.

Если в запрос сертификата должна быть включена некоторая дополнительная информация, нужно поместить ее в заранее созданный массив структур CRYPT_ATTR_BLOB, а ссылками на такие массивы инициализировать массив CRYPT_ATTRIBUTE. Ссылка на последний массив и количество элементов в нем записывается в соответствующие поля структуры CERT_REQUEST_INFO. Для ясности изложения этот этап рассматривать не будем.

В структуру CERT_REQUEST_INFO необходимо вписать номер версии сертификата. CryptoAPI поддерживает сертификаты трех версий: 1 - сертификат содержит минимальный набор данных (работу именно с такими сертификатами мы и рассмотрим); 2 - сертификат содержит дополнительно уникальные идентификаторы владельца и издателя; 3 - сертификат включает дополнительную информацию об издателе (Центре сертификации), например его адрес электронной почты или лицензию на выпуск сертификатов.

Вызвать функцию CryptExportPublicKeyInfo, которая вернет инициализированную структуру CERT_PUBLIC_KEY_INFO, содержащую открытые части ключей пользователя.

Записать в поле SubjectPublicKeyInfo структуры CERT_REQUEST_INFO ссылку на структуру, созданную на шаге 9.

Вызвать функцию CryptSignAndEncodeCertificate, передав ей в качестве аргумента структуру CERT_REQUEST_INFO.


Эта функция закодирует структуру CERT_REQUEST_INFO и все данные, на которые в этой структуре имеются ссылки, подпишет эту закодированную информацию и еще раз закодирует уже подписанные данные.

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

{SubjectEdit - поле формы, в которое пользователь вводит текст поля Subject сертификата; поле формы ContainerEdit может содержать имя контейнера ключей (если остается пустым, используется контейнер по умолчанию)} procedure TCreateReqForm.OKBtnClick (Sender: TObject); var nameAttr: CERT_RDN_ATTR; nameString: PChar; rdn: CERT_RDN; nameInfo: CERT_NAME_INFO; certReqInfo: CERT_REQUEST_INFO; subjNameBlob: CERT_NAME_BLOB; encNameLen: DWORD; encName: PBYTE; prov: HCRYPTPROV; pubKeyInfoLen: DWORD; pubKeyInfo: PCERT_PUBLIC_KEY_INFO; encCertReqLen: DWORD; params: CRYPT_OBJID_BLOB; sigAlg: CRYPT_ALGORITHM_IDENTIFIER; signedEncCertReq: PBYTE; cont: PChar; err: string; encType: DWORD; f: file; begin encType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; nameString:= StrAlloc (length (SubjectEdit.text)+1); StrPCopy (nameString, SubjectEdit.Text); nameAttr.pszObjId:= '2.5.4.3'; nameAttr.dwValueType:= CERT_RDN_PRINTABLE_STRING; nameAttr.Value.cbData:= length (SubjectEdit.text); nameAttr.Value.pbData:= PBYTE (nameString); rdn.cRDNAttr:= 1; rdn.rgRDNAttr:= @nameAttr; nameInfo.cRDN:= 1; nameInfo.rgRDN:= @rdn; {выясняем размер закодированного имени пользователя} CryptEncodeObject (encType, X509_NAME, @nameInfo, nil, @encNameLen) or (encNameLen < 1); GetMem (encName, encNameLen); {кодируем имя пользователя} CryptEncodeObject (PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_NAME, @nameInfo, encName, @encNameLen) or (encNameLen < 1); subjNameBlob.cbData:= encNameLen; subjNameBlob.pbData:= encName; certReqInfo.Subject:= subjNameBlob; certReqInfo.cAttribute:= 0; certReqInfo.rgAttribute:= nil; certReqInfo.dwVersion:= CERT_REQUEST_V1; if length (ContainerEdit.Text) = 0 then cont:= nil else begin err:= ContainerEdit.Text; cont:= StrAlloc (length (err) + 1); StrPCopy (cont, err); end; CryptAcquireContext (@prov, cont, nil, PROV_RSA_FULL, 0); CryptExportPublicKeyInfo (prov, AT_SIGNATURE, encType, nil, @pubKeyInfoLen); GetMem (pubKeyInfo, pubKeyInfoLen); CryptExportPublicKeyInfo (prov, AT_SIGNATURE, encType, pubKeyInfo, @pubKeyInfoLen); certReqInfo.SubjectPublicKeyInfo:= pubKeyInfo^; FillChar (params, sizeof (params), 0); sigAlg.pszObjId:= szOID_OIWSEC_sha1RSASign; sigAlg.Parameters:= params; CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_REQUEST_TO_BE_SIGNED, @certReqInfo, @sigAlg, nil, nil, @encCertReqLen); GetMem (signedEncCertReq, encCertReqLen); CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_REQUEST_TO_BE_SIGNED, @certReqInfo, @sigAlg, nil, signedEncCertReq, @encCertReqLen); if SaveDlg.Execute then begin AssignFile (f, SaveDlg.FileName); rewrite (f, 1); BlockWrite (f, signedEncCertReq^, encCertReqLen); CloseFile (f); end; StrDispose (nameString); FreeMem (encName, encNameLen); if cont <> nil then StrDispose (cont); FreeMem (pubKeyInfo, pubKeyInfoLen); FreeMem (signedEncCertReq, encCertReqLen); CryptReleaseContext (prov, 0); end;



Итак, запрос сертификата создан, но что с ним делать? Если вам нужен сертификат, который можно использовать для организации безопасной связи с зарубежными партнерами, нужно отправить созданный запрос в центр сертификации, предоставив необходимые подтверждающие личность документы и уплатив соответствующую сумму. Если вы собираетесь обмениваться только в рамках сети предприятия, располагающей сервером Windows 2000 и выше, можно воспользоваться Microsoft Certificate Server. Если же вашей целью, например, является только отладка программ, или если группа, внутри которой вы собираетесь организовать обмен информацией, располагает лишь компьютерами под Windows 98 (и ниже), то можно подписать сертификат самостоятельно. Подписание сертификата

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



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

Открываем файл с закодированным запросом сертификата и считываем его содержимое в память (указатель reqEncoded).

Декодируем запрос:

{encType, size, rsize: DWORD; buf: PBYTE;} encType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; GetMem (buf, 2048); rsize:= 2048; CryptDecodeObject (encType, X509_CERT, reqEncoded, size, 0, buf, @rsize);

В декодированном запросе выделяем и декодируем информацию, предназначенную для подписания - уже знакомую нам структуру CERT_REQUEST_INFO:

{p: pointer; signedContent: PCERT_SIGNED_CONTENT_INFO; DERBLOB: CRYPT_DER_BLOB; buf2: PBYTE; pCertReqInfo: PCERT_REQUEST_INFO;} p:= buf; signedContent:= p; DERBLOB:= signedContent^.toBeSigned; rsize:= 512; GetMem (buf2, rsize); CryptDecodeObject (encType, X509_CERT_REQUEST_TO_BE_SIGNED, DERBLOB.pbData, DERBLOB.cbData, 0, buf2, @rsize); p:= buf2; pCertReqInfo:= p;

Извлекаем из полученной информации строку с именем (названием) владельца сертификата, чтобы отобразить ее на форме:

{subjNameBLOB: CERT_NAME_BLOB; subjNameString: PChar;} subjNameBLOB:= pCertReqInfo^.Subject; rsize:= CertNameToStr (encType, @subjNameBLOB, CERT_SIMPLE_NAME_STR, subjNameString, 512); subjectEdit.Text:= subjNameString;

Проверяем подпись под запросом сертификата:

signCheckBox.Checked:= CryptVerifyCertificateSignature(prov, encType, reqEncoded, size, @(pCertReqInfo^.SubjectPublicKeyInfo));

Напоследок - заполняем поля формы "Действителен с" и "Действителен по" текущей датой и датой, отстоящей на год вперед:

NotBeforeEdit.Text:= DateTimeToStr (Now); NotAfterEdit.Text:= DateTimeToStr (Now + 365);

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

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


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

Подключаемся к контейнеру ключей администратора.

Заполняем поля сертификата, представленного структурой CERT_INFO:

{certInfo: CERT_INFO; serNum: int64; params: CRYPT_OBJID_BLOB; nameStr: PChar; nameAttr: CERT_RDN_ATTR; rdn: CERT_RDN; nameInfo: CERT_NAME_INFO;} certInfo.dwVersion:= CERT_V1; {версия 1} serNum:= strtoint64(serNumEdit.Text); certInfo.SerialNumber.cbData:= sizeof (serNum); certInfo.SerialNumber.pbData:= @serNum; FillChar (params, sizeof (params), 0); certInfo.SignatureAlgorithm.pszObjId:= szOID_OIWSEC_sha1RSASign; certInfo.SignatureAlgorithm.Parameters:= params; nameStr:= StrAlloc (length (IssuerEdit.text)+1); StrPCopy (nameStr, IssuerEdit.Text); nameAttr.pszObjId:= '2.5.4.3'; nameAttr.dwValueType:= CERT_RDN_PRINTABLE_STRING; nameAttr.Value.cbData:= length (IssuerEdit.text); nameAttr.Value.pbData:= PBYTE (nameStr); rdn.cRDNAttr:= 1; rdn.rgRDNAttr:= @nameAttr; nameInfo.cRDN:= 1; nameInfo.rgRDN:= @rdn;

Кодируем строку, содержащую название издателя сертификата:

{encNameLen: DWORD; encName: PBYTE; issNameBLOB: CERT_NAME_BLOB;} CryptEncodeObject (encType, X509_NAME, @nameInfo, nil, @encNameLen); GetMem (encName, encNameLen); CryptEncodeObject (encType, X509_NAME, @nameInfo, encName, @encNameLen); issNameBlob.cbData:= encNameLen; issNameBlob.pbData:= encName; certInfo.Issuer:= issNameBLOB;

Кодируем даты начала и конца срока действия сертификата:

{sysTime: TSystemTime;} DateTimeToSystemTime (StrToDateTime (NotBeforeEdit.Text), sysTime); SystemTimeToFileTime (sysTime, certInfo.notBefore); DateTimeToSystemTime (StrToDateTime (NotAfterEdit.Text), sysTime); SystemTimeToFileTime (sysTime, certInfo.notAfter);

Поля сертификата, содержащие информацию о его владельце, заполняем на основании данных, содержащихся в декодированном запросе сертификата:

certInfo.Subject:= pCertReqInfo.Subject; certInfo.SubjectPublicKeyInfo:= pCertReqInfo.SubjectPublicKeyInfo;



В неиспользуемые поля вписываем нули и пустые указатели:

certInfo.IssuerUniqueId.cbData:= 0; certInfo.IssuerUniqueId.pbData:= nil; certInfo.IssuerUniqueId.cUnusedBits:= 0; certInfo.SubjectUniqueId.cbData:= 0; certInfo.SubjectUniqueId.pbData:= nil; certInfo.SubjectUniqueId.cUnusedBits:= 0; certInfo.cExtension:= 0; certInfo.rgExtension:= nil;

Подписываем и кодируем сертификат:

{encCertLen: DWORD; encCert: PByte;} CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, nil, @encCertLen); GetMem (encCert, encCertLen); CryptSignAndEncodeCertificate (prov, AT_SIGNATURE, encType, X509_CERT_TO_BE_SIGNED, @certInfo, @(certInfo.SignatureAlgorithm), nil, encCert, @encCertLen);

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

Хранение сертификатов

Созданный сертификат владелец может отправлять своим корреспондентам для организации безопасной связи. Чтобы сделать полученный сертификат доступным системе, его нужно поместить в одно из хранилищ сертификатов. Windows предусматривает существование нескольких системных хранилищ сертификатов: MY (для хранения сертификатов отдельного пользователя), СА (от Certification Authority - для хранения сертификатов центров сертификации) и ROOT (для хранения корневых сертификатов). Открытое (загруженное в память) хранилище сертификатов представляет собой связанный список блоков данных, каждый из которых содержит ссылку на следующий блок и на данные сертификата. Каждое хранилище сертификатов физически размещается либо в отдельном файле, либо в реестре Windows. При этом для работы с системными хранилищами не нужно знать их местоположения - достаточно указать приведенные выше имена. Для помещения сохраненного в файле подписанного сертификата в системное хранилище нужно выполнить следующие шаги. Открыть файл и считать его содержимое в буфер.

При помощи специальной функции создать контекст сертификата:

{encCertLen: DWORD; - размер закодированного сертификата encCert: PByte; - данные сертификата context: PCCERT_CONTEXT; encType: DWORD;} encType:= PKCS_7_ASN_ENCODING or X509_ASN_ENCODING; context:= CertCreateCertificateContext (encType, encCert, encCertLen);



Открыть системное хранилище сертификатов:

{store: HCERTSTORE;} store:= CertOpenSystemStore (0, 'MY');

Добавить контекст сертификата в открытое хранилище:

n:= nil; CertAddCertificateContextToStore (store, context, CERT_STORE_ADD_REPLACE_EXISTING, n)

Функции CertAddCertificateContextToStore, кроме дескрипторов хранилища и добавляемого контекста сертификата, передается параметр, определяющий действия системы в том случае, если в данном хранилище уже имеется идентичный сертификат. Использованная константа CERT_STORE_ADD_REPLACE_EXISTING предписывает в таком случае удалить старый сертификат и заменить его новым. Последний параметр функции позволяет получить указатель на указатель на копию сертификата, созданную при добавлении контекста в хранилище (если параметр равен пустому указателю, то ссылка не возвращается). Закрыть хранилище, освободить контекст сертификата и память.

CertCloseStore (store, 0); CertFreeCertificateContext (context); FreeMem (encCert, encCertLen);

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

{store: HCERTSTORE; cont, stor: PChar; err: string; cert: PCCERT_CONTEXT; nameString: PChar; size: DWORD; nameBLOB: CERT_NAME_BLOB; подключение к криптопровайдеру считается выполненным!} err:= CertStoreBox.Text; RepMemo.Lines.Add (''); RepMemo.Lines.Add ('===================='); RepMemo.Lines.Add ('Contents of store ' + err); RepMemo.Lines.Add ('===================='); stor:= StrAlloc (length (err) + 1); StrPCopy (stor, err); store:= CertOpenSystemStore (prov, stor); cert:= CertEnumCertificatesInStore (store, nil); nameString:= StrAlloc (512); while cert <> nil do begin RepMemo.Lines.Add ('---------------'); RepMemo.Lines.Add ('Subject:'); nameBLOB:= cert^.pCertInfo^.Subject; size:= CertNameToStr (encType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512); if size > 1 then RepMemo.Lines.Add (nameString) else RepMemo.Lines.Add ('Error'); RepMemo.Lines.Add ('Issuer:'); nameBLOB:= cert^.pCertInfo^.Issuer; size:= CertNameToStr (encType, @nameBlob, CERT_SIMPLE_NAME_STR, nameString, 512); if size > 1 then RepMemo.Lines.Add (nameString) else RepMemo.Lines.Add ('Error'); cert:= CertEnumCertificatesInStore (store, cert); end; StrDispose (nameString);



Проверка сертификата

Получив новый сертификат, конечно, следует убедиться в корректности подписи под ним. При этом сам сертификат, скорее всего, будет помещен в личное хранилище пользователя (MY), а сертификат его издателя может находиться в хранилищах CA или ROOT. Кстати, при установке Windows в эти хранилища помещается множество сертификатов признанных центров сертификации, список которых можно просмотреть при помощи приведенной выше программы. Для выполнения проверки следует считать из проверяемого сертификата строку с именем его издателя и найти в одном из системных хранилищ его сертификат. Для облегчения операции поиска в нескольких хранилищах CryptoAPI 2.0 поддерживает механизм коллекций (или логических хранилищ) сертификатов. Коллекция может объединять данные из нескольких физических хранилищ и выполнять операции над всеми их сертификатами одновременно. Кстати говоря, в Windows 2000 и выше системные хранилища сертификатов сами представляют собой коллекции. Поиск сертификата издателя и проверка заданного сертификата выполняются одновременно функцией CertGetIssuerCertificateFromStore. Ей следует передать дескриптор хранилища сертификатов, ссылку на контекст проверяемого сертификата, возможно - ссылку на предыдущий найденный сертификат издателя (если вызов функции производится повторно) и ссылку на флаговую переменную. Эта переменная при вызове функции задает режим проверки, а при возврате - служит индикатором успеха проверки. Функция поддерживает несколько режимов проверки, которые могут комбинироваться; мы воспользуемся сочетанием двух из них - CERT_STORE_SIGNATURE_FLAG (проверить подпись издателя под заданным сертификатом) и CERT_STORE_TIME_VALIDITY_FLAG (проверить срок действия заданного сертификата). Рассмотрим процедуру проверки сертификата с заданным полем Subject на примере программы. Подключаемся к криптопровайдеру.

Открываем выбранное хранилище сертификатов.

Считываем из формы поле Subject и ищем соответствующий сертификат в хранилище:

{subj: PWideChar; err: string; cert: PCCERT_CONTEXT; тип и значение encType - см.


выше} err:= SubjectEdit.Text; GetMem (subj, 2 * length (err) + 1); StringToWideChar (err, subj, 2 * length (err) + 1); cert:= CertFindCertificateInStore (store, encType, 0, CERT_FIND_SUBJECT_STR, subj, nil); FreeMem (subj, 2 * length (err) + 1); if cert = nil then begin MessageDlg ('Certificate not found', mtError, [mbOK], 0); CertCloseStore (store, 0); exit; end;

Создаем коллекцию (логическое хранилище) сертификатов:

{collect: HCERTSTORE;} collect:= CertOpenStore (CERT_STORE_PROV_COLLECTION, 0, 0, 0, nil);

Открываем и помещаем в коллекцию интересующие нас системные хранилища сертификатов - MY, CA, ROOT:

{mystore, castore, rootstore: HCERTSTORE;} mystore:= CertOpenSystemStore (prov, 'MY'); CertAddStoreToCollection (collect, mystore, 0, 0); castore:= CertOpenSystemStore (prov, 'CA'); CertAddStoreToCollection (collect, castore, 0, 2); rootstore:= CertOpenSystemStore (prov, 'ROOT'); CertAddStoreToCollection (collect, rootstore, 0, 1)

Последним параметром функции CertAddStoreToCollection задается приоритет добавляемого хранилища в коллекции. Мы ожидаем, что сертификат издателя окажется в хранилище СА, поэтому для этого хранилища задан самый высокий приоритет, для ROOT - более низкий, а для MY - низший. Устанавливаем режим проверки:

{flags: DWORD;} flags:= CERT_STORE_SIGNATURE_FLAG or CERT_STORE_TIME_VALIDITY_FLAG;

Выполняем поиск сертификата издателя и проверку заданного сертификата:

{icert: PCCERT_CONTEXT;} icert:= CertGetIssuerCertificateFromStore (collect, cert, nil, @flags); if icert = nil then case int64(GetLastError) of CRYPT_E_NOT_FOUND: MessageDlg ('Issuer certificate not found', mtError, [mbOK], 0); CRYPT_E_SELF_SIGNED: MessageDlg ('This is root certificate', mtWarning, [mbOK], 0); else MessageDlg ('Invalid arguments', mtError, [mbOK], 0); end else if flags = 0 then MessageDlg ('Certificate is valid', mtInformation, [mbOK], 0) else MessageDlg ('Certificate is invalid', mtError, [mbOK], 0);

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



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

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

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

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

Приложение.

Авторы ищут издателя для публикации учебного пособия по данной теме.
Персональный сайт авторов - http://www.is.svitonline.com/vilys/.




Распределенные атаки на распределенные системы


А.А. Грушо (Доктор физико-математических наук)

Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO

В стандарте FIPA [] агент определяется как сущность, способная вести себя автономно, выполнять план и распознавать другие сущности в протоколах, в которых они участвуют. Есть по крайней мере два протокола, в которых каждый агент ВМАС является участником. Первый — протокол взаимодействия агентов противника. Второй — это легальный протокол, содержащий агента в виде встроенного в некоторую область кода и процесса, использующего ресурсы компьютера.

Пусть компьютерная система разделена на два уровня — High и Low. Если субъект на уровне High может выполнять все свои действия и способен "видеть" действия субъекта на уровне Low, но любой субъект на уровне Low не может "видеть" никаких действий или их результатов на уровне High, то тогда система удовлетворяет условию невлияния. Если враждебный агент находится на уровне High, а механизмы защиты находятся на уровне Low, и выполняются условия невлияния, то агент не может быть "увиден" средствами защиты.

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

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

Рисунок 1. Схема работы компьютера

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

Рисунок 2. Враждебный агент в схеме компьютера

Эта модель описывает теоретическую возможность работы "невидимого" агента.

А.А. Грушо (Доктор физико-математических наук)
Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO

Итак, мы описали, каким образом можно построить "невидимый" канал между агентами на уровне High компьютерной системы с одной операционной системой. Но распределенная система основана на сети, в которой уровень Low, как правило, находится под контролем системы безопасности. Например, можно использовать снифферы. Здесь нет канала на уровне High. Тогда "невидимость" канала между агентами противника, использующими уровень Low, означает, что агенты уровня High могут прятать информацию в легальных каналах уровня Low. Здесь возникают три проблемы. Первая — спрятать спуск информации с уровня High на уровень Low от механизмов защиты. Вторая — это преодоление механизмов защиты, предназначенных для уничтожения скрытых каналов. И третья проблема — способность агентов быть интеллектуальными и использовать стойкие методы стеганографии.

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

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

Рассмотрим схему сети ().

Рисунок 4. Схема глобальной сети

Пусть имеется m+1 сегментов локальных вычислительных сетей, S0, S1,...,Sm, в каждом из которых есть рабочие станции со своими локальными адресами и шлюзы, соединяющие локальные сети с глобальной сетью (например, Интернет). Пусть s0, s1, ..., sm — адреса шлюзов сегментов локальных вычислительных сетей S0, S1, ..., Sm, которые представляют эти сегменты в глобальной сети.


А.А. Грушо (Доктор физико-математических наук)
Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO

Чтобы осуществить распределенную атаку, должна быть построена "невидимая" сеть агентов. В предыдущих разделах мы обсуждали, каким образом это можно сделать. На всех шагах распределенной атаки ВМАС должна быть интеллектуальной.

Для моделирования интеллектуальных свойств ВМАС мы использовали результаты исследований по Open Agent Architecture []. Пусть существует три класса агентов в ВМАС. Первый класс состоит из агентов-посредников. Второй класс включает в себя мета-агентов. Третий класс составляют агенты интерфейса с внешними сетями.

Агент-посредник представляет собой специализированного служебного агента, который отвечает за координацию взаимодействия агентов, их связь и кооперацию, а также за "невидимость" мета-агентов, связанных с ним. "Невидимость" агентов-посредников может быть реализована методами, описанными в соответствующем разделе выше. В некоторых случаях посредник обеспечивает хранение данных для других типов агентов, то есть предоставляет им функции "blackboard" для их взаимодействия. Посредники должны быть связаны между собой в некоторый кластер. В частном случае это может быть иерархическая структура.

Предположим, что посредники могут взаимодействовать друг с другом в определенной последовательности. Если мета-агент А выполняет план Р и ему необходим сервис S, то он обращается к агенту-посреднику F за сервисом. Агент-посредник F посылает сообщение другим агентам-посредникам о необходимости сервиса S. Каждый агент-посредник F' делает запрос своим мета-агентам на сервис S. Если F' получает отказ, то он передает запрос F на сервис S следующему агенту-посреднику F'' и т.д. Если F' получает положительный ответ от одного из своих мета-агентов, то он передает этот положительный ответ F. Пропускная способность такого канала может быть низкой, но первый шаг атаки не нуждается в скорости.


А.А. Грушо (Доктор физико-математических наук)
Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO

Безопасность определяется знанием возможных атак. Наиболее опасные атаки на распределенные системы — это распределенные атаки. Такие атаки могут осуществляться враждебными многоагентными системами. ВМАС может быть "невидимой" и интеллектуальной. Координация агентов в ВМАС также может быть "невидимой" и осуществляться с помощью скрытых каналов.

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




А.А. Грушо (Доктор физико-математических наук)
Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO

[1] A.A. Грушо , Е.Е. Тимонина -- Модель невлияния для сети. -- Обозрение прикладной и промышленной математики, т. 7 (1), Москва: ТВП, 2000

[2] A.A. Грушо , Е.Е. Тимонина -- Двойственность многоуровневой политики безопасности. -- Тез. конф. "Методы и технические средства информационной безопасности", С.-Петербург, 2000

[3] A.A. Грушо , Е.Е. Тимонина , Э.А. Применко -- Анализ и синтез криптоалгоритмов. Курс лекций. -- Йошкар-Ола: изд-во Марийского филиала Московского открытого социального университета, 2000

[4] A.A. Грушо , Е.Е. Тимонина -- Языки в скрытых каналах. -- Труды XXX международной конференции "Информационные технологии в науке, образовании, телекоммуникации, бизнесе", Украина, 2003

[5] A.A. Грушо , Е.Е. Тимонина -- Оценка времени обучения агента для организации скрытого канала. -- Дискретная математика, Т. 15 (2), 2003

[6] A.A. Грушо , Е.Е. Тимонина -- Преодоление защиты от скрытого канала. -- Обозрение прикладной и промышленной математики, Т. 10 (3), Москва: ТВП, 2003

[7] А.А. Грушо , Е.Е. Тимонина -- Проблемы компьютерной безопасности. -- Сб. научных докладов "Информационные технологии в производстве, медицине, психологии и этике" Академии информационных управленческих технологий. — М.: Центр Управления Полетами, 2003

[8] А.А. Грушо , Е.Е. Тимонина -- Стохастические скрытые каналы. -- Материалы международн. семинара "Информатика и общество" I&S'04 (10-24 января). — Низкие Татры, 2004

[9] А.А. Грушо , Е.Е. Тимонина -- Нарушение безопасности систем с единой точкой входа. -- Материалы 8-ой международной конференции "Связь-2004", озеро Иссык-Куль, 22-29 августа, 2004, Новосибирск: ЗАО РИЦ Прайс Курьер, 2004

[10] А.А. Грушо , Е.Е. Тимонина -- Скрытые каналы с использованием HTML. -- Труды XXXII международной конференции и III международной конференции молодых ученых "Информационные технологии в науке, образовании, телекоммуникации и бизнесе.


А.А. Грушо (Доктор физико-математических наук)

Е.Е. Тимонина (кандидат физико-математических наук)
Информационный бюллетень JET INFO




На практике можно разместить агента в ядре операционной системы таким образом, что он будет контролировать и модифицировать всю деятельность системы безопасности. Данная конструкция реализует метод "men-in-the-middle" [], она была выполнена в некоторых практических разработках. Программы такого типа можно найти в Интернете. Они называются руткиты.

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

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

Hacker Defender является программным агентом, функционирующим на платформах Windows NT 4.0/2000/XP, а также на более поздних версиях систем на базе Windows NT. Основная идея данной программы состоит в перезаписи некоторых сегментов памяти во всех запущенных процессах. При этом описанные действия не должны оказывать влияния на стабильность работы системы или работающих процессов. Программа может быть абсолютно "невидима" для всех остальных процессов, в том числе и для средств защиты [, ]. Тем самым противник имеет возможность скрывать файлы, процессы, системные службы и драйверы, ключи реестра и их значения, открытые порты. Программа также осуществляет маскировку своих действий в памяти и прячет идентификаторы скрываемых процессов. Кроме того, этот агент инсталлирует скрытый "blackdoor", регистрируется как скрытый системный сервис и инсталлирует скрытый системный драйвер. Технология "blackdoor" позволяет внедрять редиректор (сетевое программное обеспечение, эмулирующее доступ прикладных программ к удаленной файловой системе как к локальной).



После запуска программы Hacker Defender перечисляет все доступные для нее процессы в системе, а затем пытается перехватить определенные вызовы API []. Перехват заключается в замене первых байт кода функции на безусловный переход к новому коду функции, предварительно сохраненному в адресном пространстве программы. Для этого выясняется адрес необходимой функции, затем в памяти программы отводится место под код нового варианта функции и ее первоначального кода, который сохраняется для дальнейшего использования. Таким образом, когда пользовательская программа вызывает функцию API, например, NtQuerySystemInformation, вызов передается функции предобработки данных. Затем может быть вызвана исходная функция, которая, в свою очередь, вернет результаты функции постобработки. Функция постобработки модифицирует данные, которые вернула исходная функция, например, удаляя некоторые записи.

Процесс перехвата вызовов API изображен на .

Рисунок 3. Процесс перехвата вызовов функции API



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

FU также является известным программным агентом, исходный код которого опубликован 03.09.2004. FU состоит из двух компонент: драйвера Windows 2000/XP (msdirectx.sys) и собственно исполняемого файла (fu.exe). Если драйвер успешно установлен, то противнику необходимо просто запустить файл fu.exe на исполнение. Заметим, что при этом противнику вовсе не нужно обладать какими-либо особыми правами, в том числе и правом запуска приложений. Данная программа непосредственно манипулирует объектами ядра операционной системы. FU модифицирует список PsActiveProcessList, содержащий список активных процессов, информацию из которого получает ZwQuerySystemInformation. При этом процесс остается существовать в качестве "свободного" потока и будет нормально функционировать, поскольку распределение процессорного времени Windows основано на потоках, а не на процессах.


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

AFX Rootkit представляет собой программного агента, который функционирует на платформах Windows NT/2000/XP/2003. Текущая версия данной программы позволяет нарушителю скрывать процессы и их идентификаторы, файлы и директории, значения системного реестра, сервисы, сетевые соединения TCP/UDP, иконки в панели задач. При установке этого агента создается директория с уникальным именем, в которой противник сможет размещать необходимые ему данные, в том числе исполняемый файл (root.exe). Заметим, что данная директория абсолютно "невидима" другими процессами, файлами, библиотеками и т.д., однако все программы внутри директории не являются скрытыми друг от друга.

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

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





Мы считаем, что для общения между собой рабочие станции различных сегментов используют виртуальную частную сеть (VPN), которая работает на основе протокола IPSec следующим образом. Пакет от рабочей станции с адресом a в сегменте Si должен быть передан на рабочую станцию с адресом b в сегменте Sj. Пакет передается так:

от машины с адресом a к локальному шлюзу LG(i) в сегменте Si;далее пакет от LG(i) попадает на узел защиты G(i), в котором пакет шифруется и инкапсулируется в пакет (пакеты) с адресом отправителя si и адресом получателя sj, пакеты имеют одинаковую длину и другие одинаковые параметры;инкапсулированный пакет из G(i) попадает на хост глобальной сети PC(i), который направляет его через глобальную сеть на аналогичный хост PC(j);далее пакет направляется на узел защиты G(j), на выходе которого восстанавливается исходный пакет, посланный от a к b, этот пакет поступает на локальный шлюз LG (j);LG (j) отправляет пакет к абоненту b в сегменте Sj.

В глобальной сети и в каждом сегменте S0, S1 ,..., Sm имеются программно-аппаратные агенты противника, которые для выполнения враждебных функций должны получать инструкции от программно-аппаратного агента противника [] из глобальной сети (ПГС). Будем считать, что противник из глобальной сети через своих агентов полностью контролирует хосты PC(k), k = 0, 1, ..., m. Программно-аппаратные агенты внутри сегментов локальной сети S0, S1, ..., Sm контролируют соответственно компьютеры LG(j), j = 0, 1, ..., m. Мы считаем, что узлы защиты G(i) сделаны правильно так, что никто из злоумышленников не может их контролировать. Таким образом, управление программно-аппаратным агентом в любом из сегментов со стороны противника из глобальной сети связано с построением канала связи от PC(j) к LG(j). Утечка информации связана с построением канала от LG(j) к PC(j).

Ни один из хостов глобальной сети (в частности, каждая машина PC(j), j = 0, 1,..., m) не знает внутренние адреса сегментов. В силу того, что шифрование и формирование пакетов для отправки через глобальную сеть происходит на узлах защиты, противник не может построить канал взаимодействия с программно-аппаратным агентом сегмента, используя шифртекст или служебные атрибуты пакетов.


Таким образом, мы предполагаем, что единственными зависимыми параметрами, известными на PC(j) и LG(j) для входного потока пакетов, являются адреса отправителя пакетов. При передаче пакетов от LG(j) к PC(j) единственными зависимыми параметрами являются адреса их получателей. Эта зависимость связывает внутренние адреса каждого сегмента и внешний адрес s соответствующего шлюза.

Скрытый канал, не требующий обучения, строится следующим образом []. Возьмем часто встречающиеся адреса s1 и s2 из множества S = {s1, ..., sm}. Модулируем поток пакетов из PC(0) в G(0) следующим образом. Опишем, например, код для 1. При передаче 1 любой очередной пакет с исходящим адресом s1 передается после передачи нечетного числа пакетов с другими адресами. Поэтому все расстояния между пакетами с исходящими адресами s1 являются четными. Рассмотрим последовательность расстояний между исходящими адресами, полученными в LG(0). Все расстояния между адресами пакетов из сегмента S1 — четные (кроме ошибок вида потери или вставки пакета, которые мы считаем достаточно редкими). Агент в LG(0), обладая достаточными вычислительными ресурсами и памятью, считает четность или нечетность расстояний между повторяющимися адресами и выявляет отклонение четных расстояний от случайного распределения длин расстояний между повторяющимися адресами из S1. Аналогично, пакет с исходящим адресом s2 передается через нечетное число пакетов с другими адресами. Таким образом, преобладание четных расстояний между адресами из S1 и четных расстояний между адресами из S2 определяет 1 в коде.

Аналогично строится код для передачи 0 и x, означающий конец передачи кода 1 или 0.

Пропускная способность данного канала однозначно связана с другим параметром, связанным с данным способом скрытой передачи информации. Это число N переданных пакетов для восстановления одного бита переданной информации. Полученные асимптотические оценки показывают, что вероятность правильно принять сигнал 1 или 0 или x агентом в LG(0) стремится к 1 при N стремящемся к бесконечности.



Пусть адреса упорядочены s1 < s2 < ... < sm. Рассмотрим другой метод общения агентов. Этот метод требует обучения. Процедура обучения необходима для того, чтобы максимально полно восстановить на LG(0) порядок.

Процедура обучения состоит в следующем. РС(0) получив очередные k пакетов с адресами si1, si2, ..., sik, упорядочивает их в соответствии с возрастанием и посылает данные пакеты на узел защиты для последующей передачи LG(0). Мы доказали [], что LG(0) в реальном масштабе времени может проводить сопоставление полученных данных и восстанавливать порядок. Тогда можно передавать информацию упорядоченными k-группами адресов, переставляя их на РС(0) в нужном порядке..

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

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

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

Рассмотрим скрытые каналы, преодолевающие PROXY-серверы [].



Прежде, чем подробно объяснить механизмы преодоления защиты, опишем общую идею. PROXY-сервер, в отличие от IPSec, устанавливает ТСР-соединения с непосредственно связанными с ним абонентами. При этом данные, передаваемые пакетами, собираются на PROXY-сервере, а затем передаются при образовании ТСР-соединения с таким же сервером на приемном конце. Сложность преодоления надежно защищенного PROXY-сервера состоит в том, что враждебный агент может манипулировать или наблюдать манипуляции с пакетами, а не с данными. Однако в основе преодоления PROXY-сервера лежит простая идея управления порядком данных с помощью задержек пакетов, передающих эти данные. Более подробно рассмотрим следующую модель.

Пусть, как и раньше, имеется m+1 сегментов локальных вычислительных сетей S0, S1, ..., Sm, в каждом из которых имеются рабочие станции со своими локальными адресами и шлюзы, используемые для соединения локальных сетей с глобальной сетью (например, Интернет). Пусть s0< s1 m упорядоченные адреса шлюзов сегментов локальных вычислительных сетей S0, S1, ..., Sm, представляющих эти сегменты в глобальной сети. Мы считаем, что для общения между собой рабочие станции различных сегментов используют виртуальную частную сеть (VPN), которая работает следующим образом. Данные от рабочей станции с адресом a в сегменте Si должны быть переданы на рабочую станцию с адресом b в сегменте Sj. Схема связи изображена на , а связь организуется следующим образом.

От машины с адресом a пакеты с передаваемыми данными, посылаются к внутреннему шлюзу — машине LG(i) в сегменте Si.Далее пакеты попадают на шлюз — узел защиты G(i). Он работает как PROXY-сервер, который устанавливает соединение с машиной с адресом а и восстанавливает данные, передаваемые от рабочей станции с адресом а на рабочую станцию с адресом b. Восстановленные данные, поступающие на PROXY-сервер от абонентов сегмента Si, выстраиваются в очередь в соответствии с порядком их восстановления на PROXY-сервере. Далее PROXY-сервер шифрует данные в очереди на ключе получателя — PROXY-сервера G(j), в сегменте которого находится получатель данных.


После этого G(i) устанавливает соединение с G(j) и передает туда пакеты, содержащие зашифрованные данные.Пакет из G(i) попадает на хост глобальной сети PC(i), который направляет его через глобальную сеть на аналогичный хост PC(j).Далее пакет направляется на узел защиты G(j), где восстанавливаются и выстраиваются в очередь данные, передаваемые на Sj. При подходе соответствующих данных в этой очереди PROXY-сервер УЗ(j) расшифровывает их и устанавливает соединение в сегменте Sj с рабочей станцией с адресом b. Данные передаются пакетами через внутренний шлюз LG(j).LG(j) отправляет пакеты к абоненту b в сегменте Sj.

Как и раньше, в глобальной сети и в каждом сегменте S0, S1, ..., Sm имеются программно-аппаратные агенты противника, которые для выполнения своих враждебных функций должны получать инструкции от программно-аппаратного агента противника из глобальной сети (ПГС). Будем считать, что ПГС полностью контролирует компьютеры PC(j), j = 0, 1, ..., m. Программно-аппаратные агенты противника внутри сегментов локальной сети S0, S1, ..., Sm контролируют соответственно компьютеры соответственно LG(j), j = 0, 1, ..., m. Мы считаем, что узлы защиты G(i) сделаны правильно так, что никто из противников не может их контролировать. Таким образом, управление программно-аппаратным агентом в любом из сегментов со стороны противника из глобальной сети связано с построением канала связи от PC(j) к LG(j). Утечка информации связана с построением канала от LG(j) к PC(j).

Как и раньше мы предполагаем, что единственными зависимыми параметрами, известными на PC(j) и LG(j) для входного потока пакетов, являются адреса отправителя пакетов. При передаче пакетов от LG(j) к PC(j) единственными зависимыми параметрами являются адреса получателей пакетов. Эта зависимость выражается в связи множества внутренних адресов каждого сегмента и внешнего адреса s соответствующего шлюза и считается в данной задаче известной.

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


Протокол ТСР гарантирует восстановление данных. Если какой-то пакет не получен, то протокол ТСР передает запрос на получение пропущенных данных. Пусть на PROXY-сервере установлено два соединения с абонентами сегмента а1 и а2, которые передают данные А1 и А2 соответственно на PROXY-сервер G(i). Естественно, что те данные, которые восстановлены первыми, будут первыми поставлены в очередь на передачу в глобальную сеть. Пусть агент в LG(i) хочет, чтобы последовательность данных в очереди на отправку была: А1 А2. Если пакеты, передающие А1, заканчиваются быстрее, чем пакеты, передающие А2 (агент наблюдает поток пакетов и может осуществлять их задержку, чтобы убедиться в том, что передача данных закончена), то агент не предпринимает никаких действий. Если пакеты, передающие А2, заканчиваются быстрее, чем пакеты, передающие А1, то агент на LG(i) задерживает или уничтожает один из пакетов (например, последний) из серии пакетов, передаваемых от а2. После этого он выжидает, когда закончится поток пакетов, передающих файл А1, и посылает последний пакет с данными А2. Тогда, если верно его предположение о том, что серия пакетов от а1 одному абоненту в другом сегменте содержала данные одного соединения А1, а аналогичная серия от а2 одному абоненту в другом сегменте содержала данные другого соединения А2, то указанная процедура поменяет естественный порядок данных в очереди на G(i) на требуемый порядок данных. Разумеется, такая же процедура перестановки на узле G(j) возможна и на потоке входящих данных с помощью агента на PC(j). Отметим, что указанная процедура носит вероятностный характер. Ясно, что вероятность правильной перестановки увеличивается для больших серий пакетов, передаваемых при отправке больших файлов.

Несмотря на возможность ошибки, можно построить язык скрытой передачи данных, использующий данный алгоритм перестановки данных в очереди. Пусть агент в LG(0) передает информацию агенту в РС(0) в глобальной сети. Тогда агент в LG(0) знает, какие данные идут на адрес получателя sj, j = 1, ..., m, серверов G(j).


С помощью алгоритма перестановки данных в очереди агент в LG(0) упорядочивает очередные пары пришедших данных.

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

В связи с описанными скрытыми каналами решена [] задача оценки r для устойчивого выделения 1, 0 и х, а также устойчивости передачи к сбоям.

В модели потока, создаваемого протоколом ТСР, для создания скрытого канала могут быть использованы задержки подтверждения. Отправив один или несколько пакетов с данными, узел ожидает подтверждения их получения, и лишь затем продолжает передачу. Число пакетов, которые могут быть переданы подряд без ожидания подтверждения, определяется размером "окна" принимающей стороны (этот параметр используется для управления скоростью передачи и задает объем данных, которые получатель способен принять, не прерывая передачу []). Таким образом, в Интернете задержки между пакетами, отправленными подряд, определяются параметрами канала передачи пакетов.

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


Поэтому возможна манипуляция ПГС задержками подтверждений, которая может быть использована в статистическом [] скрытом канале низкой пропускной способности.

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

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

Чаще всего наибольшая нагрузка на канал связи возникает при последовательной передаче больших объемов данных. При этом для ускорения передачи протокол ТСР формирует пакеты определенной длины (как правило, 1500 байт) и полностью использует приемное "окно" получателя. В потоке возникают серии пакетов, отправленных с минимальными (для физического канала) интервалами. После обработки алгоритмом ограничения скорости эти интервалы увеличиваются для обеспечения заданной средней скорости. Изменение скорости передачи [] происходит за счет манипуляции интервалами между пакетами. Тогда шлюз, через который проходят пакеты, имеет возможность встраивать в поток пакетов скрытую информацию с помощью манипуляции скоростями. Для того чтобы интервалы между пакетами, определяющие скорость передачи, не изменились на маршруте от данного шлюза до получателя, серия пакетов не должна полностью помещаться в буфер ни на одном из шлюзов на этом маршруте.


В противном случае скрытая информация, содержащаяся в потоке, окажется искаженной.

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

Опишем способ скрытой передачи информации агенту, контролирующему единую точку входа [].

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

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

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


В этом случае программно- аппаратный агент дает права пользователю на требуемые ресурсы и может очистить данные аудита на сервере идентификации/аутентификации. Однако, имея распределенную систему аудита, доступ к запрещенной для этого пользователя информации будет отражен в других системах аудита, например, в данных аудита СУБД. При правильно работающей системе анализа данных аудита служба безопасности получит информацию о том, что данный пользователь с данной рабочей станции получил ценную информацию. Поэтому, войдя на рабочую станцию от своего имени, нарушитель безопасности должен обращаться со специальным паролем к агенту на сервере аутентификации, называя вымышленный идентификатор, то есть от чужого имени.

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

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


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

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

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

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


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

Пусть агент обладает достаточными вычислительными возможностями для оценки промежутка времени, необходимого для m вхождений в систему любых других пользователей. Если это время не превосходит заданного порога, то агент выделяет данную группу пользователей как своего союзника. После m вхождений и выходов из системы группа нарушителей продолжает работать в обычном режиме и при этом начинается выработка языка общения агента с группой нарушителей. Если в заданном промежутке группа нарушителей вошла в систему ровно один раз, то их перестановке (порядки появления на сервере) соответствует двоичный вектор длины k. Этот вектор передается агентом к членам группы нарушителей в форме ответов о правильной или неправильной аутентификации. Достаточно сделать первую посылку вектора из всех 0 в ответ на заведомо ложные пароли, так как все двоичные вектора можно считать лексикографически упорядоченными. Тогда 2k перестановок порядка вхождения в систему данной группы воссоздадут у агента и членов группы нарушителей код, который можно использовать при дальнейшем общении агента и группы нарушителей. Любая другая комбинация вхождений в систему уже не будет считаться у агента значимой.

Рассмотрим скрытый канал через Интернет с помощью HTML []. В данном случае речь пойдет о задаче построения скрытого канала между далеко расположенными корреспондентами.

Пусть пользователь А хочет передать короткое сообщение пользователю B через Интернет. Предположим, что пользователь А имеет доступ к браузеру, а пользователь B имеет доступ к аудиту обращений на некоторую страницу Интернет. Все обращения пользователя А к информационным ресурсам Сети отслеживаются контролером U. Задача состоит в том, чтобы построить скрытый от U канал передачи информации от пользователя А к пользователю B.

В литературе описано множество скрытых каналов для решения этой задачи.


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

Изложим содержание метода. С помощью последовательности гипертекстовых ссылок пользователь А попадает на сайт, к которому имеет доступ абонент В, и выбирает оговоренный секретным ключом документ. Пусть R1, ..., RN — последовательность возможных гипертекстовых ссылок в этом документе. Тогда скрытое сообщение от пользователя А к пользователю В можно закодировать перестановкой вызовов этих гиперссылок Rj1, ..., RjN. Перестановка определяется с помощью вызовов и меток времени, находящихся в журнале аудита.

Если B1, ..., BN сайты, в которых абонент В может получить доступ к данным аудита, то перестановками Bi1, ..., BiN можно кодировать допустимые сообщения.

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

Возникает вопрос о способе кодирования сообщения с помощью перестановок. Один из вариантов кодирования можно построить следующим образом. Рассматривая некоторую нумерацию перестановок, относим номеру данной перестановки двоичное представление этого номера. Тогда сообщение можно писать на любом доступном языке, используя для его кодирования двоичные векторы. Использование данного метода ограничено вычислительными возможностями при нумерации перестановок. Приведем некоторые значения числа перестановок, показывающие возможности кодирования сообщений для различных N: 5! = 120, а 10! = 3628800.





Все мета- агенты связаны между собой через агентов-посредников. Каждый мета-агент имеет своего агента-посредника для взаимодействия в ВМАС. Мета-агенты исполняют роль ассистентов посредников при координации деятельности всех агентов. Мета-агенты могут быть сделаны "невидимыми" с помощью своих агентов-посредников. Агент-посредник и мета-агент могут играть роль "men-in-the-middle" в легальном протоколе. Это путь контроля и модификации любого легального протокола внутри одного компьютера.

Агенты-посредники и агенты интерфейса играют роль "men-in-the-middle" в легальных протоколах связи. Основная проблема здесь — сделать их быстро работающими. Агенты интерфейса могут связываться друг с другом с помощью скрытых каналов, если они находятся в различных сегментах сети под охраной своих агентов-посредников.

Мета-агенты могут создаваться и могут уничтожаться. Коды агентов могут передаваться через агентов-посредников или агентов интерфейса.

Рассмотрим, каким образом ВМАС работает в распределенной атаке.

Мета-агенты используют методы распознавания для сканирования окружающей среды. Они находят точки для модификации информации и для выстраивания "men-in-the-middle". Мета-агенты могут иметь информацию о выполнении атаки или могут ее не иметь. В последнем случае они должны найти сервис в форме, содержащей план, что делать дальше. План атаки может передаваться по сети.

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

Если распределенная система разрушается, то это приводит к ущербу, но в таком случае и ВМАС также разрушается. После восстановления распределенной системы ВМАС должна создаваться с самого начала. Поэтому противник должен предпочесть нанесение ущерба с помощью ошибочных вычислений или Византийского поведения [].

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





IT+S&E'2005", Украина, 2005

[11] А.В. Гусев -- Скрытый канал с модуляцией скорости передачи. -- Труды XXXII международной конференции и III международной конференции молодых ученых "Информационные технологии в науке, образовании, телекоммуникации и бизнесе. IT+S&E'2005", Украина, 2005

[12] Г. Неббет -- Справочник по базовым функциям API Windows NT/2000. -- Пер. с англ. — М.: Издательский дом "Вильямс", 2002

[13] Е.Е. Тимонина -- Скрытые каналы (обзор). -- Jet Info: изд-во компании "Джет Инфо Паблишен" — 14(114)., 2004

[14] COUGAAR Architecture Document. -- A BBN Technologies Document, Version for Cougaar 11.4, 2004

[15] A. Galatenko , А. Grusho , А. Kniazev , Е. Timonina -- Covert Channels through PROXY Server. -- The Third International Workshop "Information Assurance in Computer Networks. Methods, Models, and Architectures for Network Security", St. Petersburg: Springer, LNCS 3685, 2005 (to be printed)

[16] J. В. Giles , B. Hajek -- An Information-theoretic and Game-theoretic Study of Timing Cannels. -- IEEE Transactions on Information Theory, 2002

[17] J.A. Goguen , J. Meseguer -- Security Policies and Security Models. -- Proceedings of the IEEE Symposium on Security and Privacy, Oakland, CA, 1982

[18] J.A. Goguen , J. Meseguer -- Inference Control and Unwinding. -- Proceedings of the IEEE Symposium on Security and Privacy, Oakland, CA, 1984

[19] A.A. Grusho , E.E. Timonina -- Construction of the Covert Channels. -- International Workshop "Information Assurance in Computer Networks. Methods, Models, and Architectures for Network Security", St. Petersburg: Springer, LNCS 2776, 2003

[20] A Guide to Understanding Covert Channel Analysis of Trusted Systems. -- National Computer Security Center, NCSC-TG-030, Ver. 1, 1993

[21] L. Gumnopoulos , S. Dritsas , S. Gritzalis , C. Lambrinoudakis -- GRID Security Review. -- International Workshop "Information Assurance in Computer Networks. Methods, Models, and Architectures for Network Security", St.


Petersburg: Springer, LNCS 2776, 2003

[22] J. Hеrard -- Validation of Communication in Safety--Critical Control Systems. -- Nordtest Report TR 543, 2003

[23] D.L. Martin , A.J. Cheyer , D.B. Moran -- The Open Agent Architecture: A Framework for Building Distributed Software Systems. -- Artifical Intelligence Center SRI International, 1998

[24] J. McLean , C. Heitmeyer -- High Assurance Computer Systems: A Research Agenda. -- Center for High Assurance Computer Systems Naval Research Laboratory, Washington, DC 20375, 1995

[25] I.S. Moskowitz , O.L. Costich -- A classical Automata Approach to Noninterference Type Problems. -- Procced. Of the Computer Security Foundations Workshop 5, Franconi, NH: IEEE Press, 1992

[26] RFC 793. Transmission Control Protocol, 1981

[27] J. Rushby -- Noninterference, Transitivity, and Channel-Control Security Policies. -- Technical Report CSL-92-02, 1992

[28] H. Father -- Hooking Windows API. -- Techniques of hooking API functions on Windows, 2002

[29] H. Father -- Invisibility on NT boxes. How to become unseen on Windows NT., 2003

[30] Foundation for Intelligent Physical Agents -- Standard: FIPA TC Communications, 2002




Рассмотрим сеть, состоящую из узлов


Рассмотрим сеть, состоящую из узлов и каналов между ними. Распределенную информационную систему можно представить как приложения в узлах сети, связанные некоторой интегрирующей системой, которая позволяет координировать использование различных приложений в решении задач. Интеграция может быть достигнута с помощью многоагентной системы (МАС).
Некоторые МАС описаны в научной литературе, например, стандарт FIPA для интеллектуальных агентов []. System Research Institute опубликовал свои результаты в Open Agent Architecture []. Много работ посвящено COUGAAR []. МАС присутствует в GRID []. Мы говорим о высоко критичных распределенных системах [], если потери велики при серьезных сбоях в таких системах. Мы предполагаем наличие злоумышленника и то, что распределенная система может подвергнуться его атаке для нанесения ущерба владельцу информации и системы.
Для предотвращения ущерба мы должны выяснить, каким образом противник может атаковать распределенную систему. Это поможет понять, как определить безопасность распределенной системы и каким образом она может быть достигнута.
Любая атака может быть разбита на два этапа. Первый включает сбор информации об атакуемой системе и организацию атаки, второй — проведение самой атаки. На первом этапе разрабатывается план для всех участников атаки с информацией о том, что следует делать в определенных обстоятельствах во время проведения атаки. На втором этапе атаки противник стремится получить доступ к уязвимым точкам, через которые наносится ущерб, а затем скрывает следы атаки, чтобы предотвратить обвинения против атакующих.
Мы предполагаем, что любая атака на отдельный хост распределенной системы не приводит к фатальному ущербу. Атака должна быть распределенной, т. е. представлять собой распределенную атаку как скоординированные действия, произведенные в различных подсистемах распределенной информационной системы с целью нанесения ущерба.
Рассмотрим, что необходимо использовать противнику для выполнения распределенной атаки.
Конечно, существуют механизмы безопасности в распределенной системе. К ним относятся аудит или системы обнаружения вторжений, контроль целостности, контроль доступов, межсетевые экраны и др. Как минимум, первый этап атаки должен быть "невидимым" для механизмов защиты.
При организации атаки необходим механизм интеграции деятельности всех противников. Рассмотрим ситуацию, когда они представлены программно-аппаратными агентами в компьютерной среде. Тогда интеграция действий противника в атаке может осуществляться с помощью враждебной многоагентной системы (ВМАС). Чтобы решать задачи по интеграции деятельности злоумышленника, ВМАС должна представлять собой сеть. Для этого необходимы коммуникации между агентами, и каналы должны быть скрытыми от средств защиты.
В настоящей статье авторы пытаются найти ответ на вопрос, могут ли данные свойства быть выполнены.
В основу ВМАС заложены три хорошо известные модели. Первая — это модель невлияния [, , , , , ]. Если выполняются условия невлияния, то можно доказать, что агенты "невидимы" для механизмов защиты. Примеры реализации "невидимых" агентов будут приведены далее.
Вторая модель — модель скрытых каналов. Она определяет возможность существования коммуникаций, "невидимых" для механизмов защиты. Частично такие коммуникации внутри компьютера описаны в работе []. Скрытые каналы в открытых сетях часто называют стеганографией. В рассматриваемой задаче скрытые от средств защиты каналы должны существовать в условиях, когда используются механизмы защиты, которые, "не видя" скрытый канал, могут препятствовать его существованию. В таких случаях мы говорим о скрытых каналах, преодолевающих защиту.
Третья модель — Open Agent Architecture (OAA) []. Она показывает, как ВМАС может быть сделана интеллектуальной.
Мы не строили большую ВМАС, но проведенные эксперименты подтверждают все положения настоящей статьи.

Эффективность защиты информации


07.08.2003

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

Факторы, влияющие на уровень защиты информации, систематизированы в ГОСТ Р 51275-99. Однако, независимо от воли и предвидения разработчиков возникают и иные, заранее неизвестные при проектировании систем защиты информации (СЗИ) обстоятельства, способные снизить эффективность защиты или полностью скомпрометировать предусмотренные проектом меры информационной безопасности. Оценка эффективности защиты информации должна обязательно учитывать эти объективные обстоятельства, а ее характеристики, как это следует из ГОСТ Р 50922-96, должны иметь вероятностный характер. Развитие подобной методологии, включая систему нормативных документов, содержащих количественные, измеримые показатели эффективности СЗИ, обеспечит интересы как заказчиков, так и проектировщиков. Особую важность приобретает обоснование оптимальных значений показателей эффективности, учитывающее целевое предназначение информационной системы.

Для решения рассматриваемой проблемы предлагается использовать системный подход. Как отмечали авторы [8], «сама идея количественного определения эффективности с полным правом может рассматриваться как поворотный пункт истории науки».



Экономический аспект


Массовое создание, внедрение и эксплуатация информационных систем привели к возникновению спектра новых проблем в сфере безопасности личности, общества и государства. Внимание к этим проблемам закономерно. Если коммерческая организация допускает утечку более 20% важной внутренней информации, то она в 60 случаях из 100 банкротится [17]. Утверждают также [11], 93% компаний, лишившихся доступа к собственной информации на срок более 10 дней, покинули бизнес, причем половина из них заявила о своей несостоятельности немедленно.

Потребность в обеспечении безопасности связана с тем, что существует множество субъектов и структур, весьма заинтересованных в чужой информации и готовых заплатить за это высокую цену. Так, стоимость устройств подслушивания, продаваемых только в США, составляет в среднем около 900 млн. долл. в год. Суммарный урон, нанесенный организациям, против которых осуществлялось прослушивание, составляет ежегодно в США около 8 млрд. долл. А ведь существуют и, соответственно, приобретаются устройства для несанкционированного доступа к информации и по другим каналам: проникновение в информационные системы, перехват и дешифровка сообщений и т.д. В результате, по данным SANS Institute, средний размер убытка от одной атаки в США на корпоративную систему для банковского и ИТ-секторов экономики составляет около полумиллиона долларов [19]. Примерная структура последствий неэффективного обеспечения информационной безопасности в американских организациях такова [18]: кража конфиденциальной информации — 20-25% от общего годового ущерба; фальсификация финансовой информации — 21-25%; заражение вредоносными программами — 11-12%; нарушение доступа к Web-сайтам — 1-11%; срыв работы информационной системы — 4-10%; незаконный доступ сотрудников к информации — 4-9%; другие виды ущерба — 14-33%.

В таких условиях все более широко распространяется мнение, что защита информации должна по своим характеристикам быть соразмерной масштабам угроз [1, 2, 16]. Отклонение от этого правила чревато дополнительным ущербом. Скажем, если уровень защищенности информационной системы превышает уровень C2 по «Оранжевой книге», то ее подсистема защиты потребляет значительную часть общих ресурсов (для систем уровня B1 эта доля составляет 20-50%, а для уровня B2 она может превышать 90%) [16]. Для каждой системы имеется оптимальный уровень защищенности, который и нужно поддерживать [2].



Качество и его подтверждение


Зачастую заказчик СЗИ плохо представляет себе значение того или иного средства и его вклад в общий уровень безопасности и в результате происходит увеличение затрат при практической неопределенности достигнутого эффекта. Как следствие, далеко не всегда заказчик СЗИ получает то, что ему реально нужно, и не может объективно проверить и оценить качество и эффективность предложенного решения [13].

Средства защиты информации в соответствии с действующими нормами и правилами подлежат обязательной или добровольной сертификации. Однако сертификация не является совершенным инструментом и не дает необходимых гарантий. В лучшем случае проверяется только 85% всех возможных состояний, а обычно — 60-70% [14].

В [20] указывается, что сертификация продукции на соответствие требованиям государственных стандартов по безопасности информации или иных нормативных документов, утвержденных Гостехкомиссией РФ, подтверждается с определенной степенью достоверности. Однако чему конкретно должна быть равна эта достоверность, является ли этот термин эквивалентным вероятностно-статистическому пониманию, не говорится. Между тем, на испытательные центры (лаборатории), проводящие испытания образцов сертифицируемой продукции и участвующие в предварительной проверке ее производства, прямо возложена ответственность за достоверность результатов. При таком положении дел нормативное требование обеспечения достоверности результатов испытаний отдельных средств и, тем более всей СЗИ, остается пустой декларацией. Таким образом, даже если элементы СЗИ формально успешно прошли все сертификационные испытания и имеют полный комплект удостоверяющих документов, это отнюдь не означает того, что реально будет обеспечен требуемый уровень качества.



Количественная оценка гарантий защиты


В современных нормативных документах по информационной безопасности, используется, как известно, классификационный подход. Гораздо более конструктивными являются вероятностные методы, нашедшие широкое распространение в практике обеспечения безопасности в других прикладных областях. В соответствии с этими методами уровни гарантий безопасности СЗИ трансформируются в доверительные вероятности соответствующих оценок показателей. Для решения данной задачи можно рекомендовать теорию статистических решений [8, 16], позволяющую находить оптимальные уровни гарантий безопасности.

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

Обобщенные данные о возможных показателях эффективности приведены в таблице 1, а критериев — в таблице 2.



Количественная оценка эффективности


В соответствии с современной теорией оценки эффективности систем [15], качество любого объекта, в том числе и СЗИ, проявляется лишь в процессе его использования по назначению (целевое функционирование), поэтому наиболее объективным является оценивание по эффективности применения.

Проектирование, организация и применение СЗИ фактически связаны с неизвестными событиями в будущем и поэтому всегда содержат элементы неопределенности. Кроме того, присутствуют и другие причины неоднозначности, такие как недостаточно полная информация для принятия управленческих решений или социально-психологические факторы. Поэтому, например, этапу проектирования СЗИ естественным образом сопутствует значительная неопределенность. По мере реализации проекта ее уровень снижается, но никогда эффективность СЗИ не может быть адекватно выражена и описана детерминированными показателями. Процедуры испытаний, сертификации или лицензирования не устраняют полностью неопределенность свойств СЗИ или ее отдельных элементов и не учитывают случайный характер атак. Поэтому объективной характеристикой качества СЗИ — степенью ее приспособленности к достижению требуемого уровня безопасности в условиях реального воздействия случайных факторов, может служить только вероятность, характеризующая степень возможностей конкретной СЗИ при заданном комплексе условий. В общей теории систем такая характеристика называется вероятностью достижения цели операции или вероятностью выполнения задачи системой. Данная вероятность должна быть положена в основу комплекса показателей и критериев оценки эффективности СЗИ. При этом критериями оценки служат понятия пригодности и оптимальности. Пригодность означает выполнение всех установленных к СЗИ требований, а оптимальность — достижение одной из характеристик экстремального значения при соблюдении ограничений и условий на другие свойства системы. При выборе конкретного критерия необходимо его согласование с целью, возлагаемой на СЗИ.

Обычно при синтезе системы возникает проблема решения задачи с многокритериальным показателем. Некоторые авторы рассматривают показатели эффективности, которые предназначены при решении задачи сравнения различных структур СЗИ. Предлагается также использовать показатели эффективности вероятностно-временного характера, имеющие смысл функций распределения. В частности, к ним относятся вероятность преодоления системы защиты информации за некоторое время [6].



Методическое обеспечение


Нормативные документы по оценке безопасности ИТ практически не содержат конкретных методик, в результате чего величина разрыва между общими декларациями и конкретным инструментарием по реализации и контролю их положений является недопустимой. Исходя же из своего предназначения, методическая база должна охватывать все критически важные аспекты обеспечения и проверки выполнения требований, предъявляемых к информационной безопасности. Объективным видом оценки эффективности СЗИ является функциональное тестирование, предназначенное для проверки фактической работоспособности реализованных механизмов безопасности и их соответствия предъявленным требованиям, а также обеспечивающее получение статистических данных. В силу того, что средства безопасности обладают ограниченными возможностями по противодействию угрозам, всегда существует вероятность нарушения защиты, даже если во время тестирования механизмы безопасности не были обойдены или блокированы. Для оценки этой вероятности должны проводиться дополнительные исследования. В методическом плане определение эффективности СЗИ должно заключаться в выработке суждения относительно пригодности способа действий персонала или приспособленности технических средств к достижению цели защиты информации на основе измерения соответствующих показателей, например, при функциональном тестировании. Эффективность оценивается для решения следующих задач:

принятие решения о допустимости практического использования СЗИ в конкретной ситуации; выявление вкладов различных факторов в достижение цели; установление путей повышения эффективности СЗИ; сравнение альтернативных вариантов систем.

Таким образом, при использовании современной методической базы, оценка эффективности СЗИ носит в основном нечеткий, субъективный характер [19]; практически полностью отсутствуют нормированные количественные показатели, учитывающие возможные случайные или преднамеренные воздействия. В результате достаточно сложно, а зачастую и невозможно, оценить качество функционирования информационной системы при наличии несанкционированных воздействий на ее элементы, а, соответственно, и определить, чем один вариант проектируемой системы лучше другого. Представляется, решением проблемы комплексной оценки эффективности СЗИ является использование системного подхода, позволяющего еще на стадии проектирования количественно оценить уровень безопасности и создать механизм управления рисками. Однако этот путь реализуем при наличии соответствующей системы показателей и критериев.



Нормативная база


Создание и эксплуатация ИС должны проводиться в соответствии с существующим законодательством и требованиями нормативно-технических документов. Данное положение, разумеется, применимо к любому виду организованной деятельности, однако ИТ развиваются исключительно быстрыми темпами, и почти всегда нормативная база отстает от потребностей практики. Здесь подобное отставание законов, нормативных актов, национальных и отраслевых стандартов, а также методического обеспечения, оказывается особенно критичным [5].

Трудности объективного подтверждения эффективности СЗИ коренятся в несовершенстве существующей нормативной базы, а также в сложившихся в ИТ подходах, принципиально отличающихся от разработанных в традиционной инженерии. Специалистами, например, отмечается недостаточная проработанность такого аспекта нормативного обеспечения, как система показателей информационной безопасности [12]. В неудовлетворительном состоянии находится система критериев безопасности, в том числе, таких, как эффективность СЗИ. К серьезным проблемам относится и игнорирование стохастичной природы событий и явлений, которые возникают в процессе защиты информации, абстрагирование от их экономического содержания в нормативном, методическом и прикладном аспектах.

Эти же замечания можно отнести и к международной нормативной базе по информационной безопасности, включающей около 50 международных стандартов ИСО/МЭК на критерии оценки безопасности ИТ и методы защиты средств и систем ИТ. Применение методов функциональной стандартизации в области информационной безопасности изложены в международном стандарте ИСО/МЭК 15408-99 «Критерии оценки безопасности информационных технологий». Фактически, Общие критерии предлагают набор исторически сложившихся и, самое главное, привычных в отрасли подходов к безопасности, которые используются, чтобы создавать изделия или системы, отражающие не столько потребности заказчика, сколько возможности разработчика. Важно отметить, что по своей сути они являются не критериями в полном смысле этого термина, а неким подобием общих технических требований, определяющих облик систем в зависимости от их назначения и условий функционирования.


При создании и развитии сложных, распределенных, тиражируемых информационных систем требуется, как известно, гибкое формирование и применение гармонизированных совокупностей базовых стандартов и нормативных документов разного уровня, выделение в них требований и рекомендаций, необходимых для реализации заданных функций информационных систем. Такие совокупности базовых стандартов должны адаптироваться и конкретизироваться применительно к определенным классам проектов, функций, процессов и компонентов информационных систем. В связи с этой потребностью выделилось и сформировалось понятие «профилей», как основного инструмента функциональной стандартизации [4]. Понятно, что число возможных профилей защиты во много раз превышает исходное количество документов, на которых они могут базироваться, поэтому провести априорную оценку эффективности всех возможных профилей невозможно. С другой стороны, профиль защиты должен создаваться или выбираться исходя из требований к показателям информационной безопасности, установленных заказчиком заранее. Принятые подходы, включая те из них, которые указаны в существующих стандартах, не позволяют сделать такой выбор, чрезвычайно важный для практики. Оценку же эффективности профилей защиты можно осуществить только с использованием комплексных показателей, которые имеют вероятностный или стоимостной характер. При этом следует обратить внимание, что, в отличие от официальных нормативных документов, в аналитических материалах, опубликованных сотрудниками Гостехкомиссии, прямо указывается на необходимость использования в качестве основного критерия эффективности СЗИ соответствующей вероятности [3].

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

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


Основные причины проблем


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

игнорирование системного подхода как методологии анализа и синтеза СЗИ; отсутствие механизмов полного и достоверного подтверждения качества СЗИ; недостатки нормативно-методического обеспечения информационной безопасности, прежде всего в области показателей и критериев.



Системность при защите информации


Уже в первых работах по защите информации были изложены основные постулаты, которые не утратили своей актуальности и по сей день [9]: абсолютную защиту создать нельзя; система защиты информации должна быть комплексной; СЗИ должна быть адаптируемой к изменяющимся условиям.

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

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


Результативное решение задач анализа и синтеза СЗИ не может быть обеспечено одними лишь способами умозрительного описания их поведения в различных условиях — системотехника выдвигает проблемы, требующие количественной оценки характеристик. Такие данные, полученные экспериментально или путем математического моделирования, должны раскрывать свойства СЗИ. Основным из них является эффективность, под которой, согласно [7], понимается степень соответствия результатов защиты информации поставленной цели. Последняя, в зависимости от имеющихся ресурсов, знаний разработчиков и других факторов, может быть достигнута в той или иной мере, при этом возможны альтернативные пути ее реализации. Эффективность имеет непосредственную связь с другими системными свойствами, в том числе качеством, надежностью, управляемостью, помехозащищенностью, устойчивостью. Поэтому количественная оценка эффективности позволяет измерять и объективно анализировать основные свойства систем на всех стадиях их жизненного цикла, начиная с этапа формирования требований и эскизного проектирования.


Технический аспект


По статистическим данным Национального отделения ФБР по компьютерным преступлениям, от 85 до 97% нападений на корпоративные сети не только не пресекаются, но даже и не обнаруживаются. Специальная группа экспертов провела анализ защищенности 8932 военных информационных систем; в 7860 (88%) случаях несанкционированное проникновение посторонних в эти системы было успешным. Администраторы только 390 из них обнаружили атаки и всего лишь 19 сообщили о них.

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



в какой мере система защиты


Для ответа на вопрос, в какой мере система защиты информации обеспечивает требуемый уровень безопасности, необходимо оценивать эффективность СЗИ показателями, носящими вероятностный характер. Совершенствование нормативной базы, методического обеспечения в области информационной безопасности должно происходить, прежде всего, в этом направлении. Содержательные результаты по оценке эффективности систем защиты информации могут быть получены при системном подходе, более того, его обязательность прямо вытекает из ГОСТ Р50922-96 [6]. Разумеется, количественная оценка эффективности СЗИ требует больше усилий, чем используемые качественные методы [4]. Однако и отдача, прежде всего экономическая, будет намного весомее, а интересы, как заказчика, так и разработчика СЗИ, будут защищены более надежно.
Литература
А. Баутов. Стандарты и оценка эффективности защиты информации. Доклад на Третьей Всероссийской практической конференции "Стандарты в проектах современных информационных систем". Москва, 23-24 апреля 2003 г. А. Баутов, Экономический взгляд на проблемы информационной безопасности. Открытые системы, 2002, № 2. С. Вихорев, А. Ефимов, Практические рекомендации по информационной безопасности. Jet Info, № 10-11, 1996. С. Вихорев, Р. Кобцев, Как определить источники угроз. Открытые системы, 2002, № 7-8. В. Галатенко, Информационная безопасность - основы. Системы управления базами данных, 1996, № 1. А. Горбунов, В. Чуменко, Выбор рациональной структуры средств защиты информации в АСУ. http://kiev-security.org.ua/box/2/26.shtml
ГОСТ Р 50922-96. Защита информации. Основные термины и определения. Г. Гуд, Р. Макол. Системотехника (Введение в проектирование больших систем). М., Сов. радио, 1962. М. Де Гроот. Оптимальные статистические решения. М.: Мир, 1974. Е. Зиндер, Революционные изменения базовых стандартов в области системного проектирования. Директор информационной службы, 2001, № 5. А. Ездаков, О. Макарова, Как защитить информацию. Сети, 1997, № 8. ИСО/МЭК 15408-99 "Критерии оценки безопасности информационных технологий". В.
Козлов. Критерии информационной безопасности и поддерживающие их стандарты: состояние и тенденции. "Стандарты в проектах современных информационных систем". Сборник трудов II-й Всероссийской практической конференции. Москва, 27-28 марта 2002 года. В. Липаев, Е. Филинов, Формирование и применение профилей открытых информационных систем. Открытые системы, 1997, № 5. Г. Петухов, Основы теории эффективности целенаправленных процессов. Часть 1. Методология, методы, модели. МО СССР, 1989. В. Пугачев. Теория вероятностей и математическая статистика. М.: Наука, 1979. В. Сабынин, Специалисты, давайте говорить на одном языке и понимать друг друга. Информост - Средства связи, № 6. П. Сэйер, Lloyd страхует от хакеров. Computerworld Россия, 2000, № 30. Л. Хмелев. Оценка эффективности мер безопасности, закладываемых при проектировании электронно-информационных систем. Труды научно-технической конференции "Безопасность информационных технологий", Пенза, июнь 2001. Положение о сертификации средств и систем вычислительной техники и связи по требованиям безопасности информации. М., 1994.
Андрей Баутов (anb_main@mail.ru) — независимый эксперт.
В соответствии с определением, приведенным в ГОСТ Р ИСО/МЭК 12207:99, «система — это комплекс, состоящий из процессов, технических и программных средств, устройств и персонала, обладающий возможностью удовлетворять установленным потребностям или целям». В связи с подобным определением полезно рассматривать и определение системного проектирования, которое, согласно INCOSE (International Council on Systems Engineering), представляет собой «междисциплинарный подход и средства, делающие возможным создание успешных систем». Системное проектирование — дисциплина разработки продуктов или процессов на основе концепции систем. Оно фокусируется на определении потребностей заказчика и требуемых функций системы, установлении требований, выполнении конструкторского синтеза и аттестации с согласованием как бизнес-аспектов, так и технических аспектов данной задачи, интегрируя необходимые дисциплины и группы специалистов в одну команду на протяжении всего жизненного цикла развития системы [11].
Системный подход — методология исследования сложных объектов как объединений элементов, связанных комплексом отношений друг с другом и выступающих единым целым по отношению к внешней среде. Основной задачей системного подхода является синтез, включающий проектирование систем и организацию процессов, предназначенных для достижения определенных целей и оптимальных по выбранному критерию.

Идентификация рисков


В любой методике управления рисками необходимо идентифицировать риски, как вариант – их составляющие (угрозы и уязвимости). Естественное требование к списку — его полнота. Сложность задачи составления списка и доказательство его полноты зависит от того, какие требования предъявляются к детализации списка. На базовом уровне безопасности, как правило, не предъявляется специальных требований к детализации классов и достаточно использовать какой-либо подходящий в данном случае стандартный список классов рисков. Оценка величины рисков не рассматривается, что приемлемо для отдельных методик базового уровня. Списки классов рисков содержатся в некоторых руководствах, в специализированном ПО анализа рисков. Примером является германский стандарт BSI (www.bsi.de, — в нем имеется каталог угроз применительно к различным элементам информационной технологии.

Достоинством подобных списков является их полнота: классов, как правило, немного (десятки), они достаточно широкие и заведомо покрывают все существующее множество рисков. Недостаток — сложность оценки уровня риска и эффективности контрмер для широкого класса, поскольку подобные расчеты удобнее проводить по более узким (конкретным) классам рисков. К примеру, класс рисков «неисправность маршрутизатора» разбивается на множество подклассов, включающих возможные виды неисправности (уязвимости) ПО конкретного маршрутизатора и неисправности оборудования.



«Использование чужого идентификатора сотрудниками организации ("маскарад")»


Для оценки угроз выбраны следующие косвенные факторы:

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

Для оценки уязвимостей выбраны следующие косвенные факторы:

Количество рабочих мест (пользователей) в системе. Размер рабочих групп. Осведомленность руководства о действиях сотрудников (разные аспекты). Характер используемого на рабочих местах оборудования и ПО. Полномочия пользователей.

По косвенным факторам предложены вопросы и несколько фиксированных вариантов ответов, которые «стоят» определенное количество баллов. Итоговая оценка угрозы и уязвимости данного класса определяется суммированием баллов.



История вопроса


Опубликованные стандарты в области защиты информации (ISO 15408, ISO 17799, ISO 9001, NIST 800-30, BSI, BS 7799, COBIT, ITIL и пр.) рассматривают вопросы анализа и управления информационными рисками (таблица 1), однако не содержат ряда важных деталей, которые обязательно надо конкретизировать при разработке практических методик управления рисками. Конкретизация этих деталей зависит от уровня зрелости организации, специфики ее деятельности и некоторых других факторов. Таким образом, невозможно предложить некую единую, приемлемую для всех отечественных компаний и организаций, универсальную методику управления рисками, позволяющую обеспечить экономически оправданную информационную безопасность предприятия. В каждом конкретном случае необходимо адаптировать общую методику управления рисками под определенные нужды предприятия, с учетом специфики его функционирования и ведения бизнеса. Давайте рассмотрим типичные вопросы и проблемы, возникающие при разработке методик управления информационными рисками в отечественных компаниях.

Таблица 1. Вопросы управления рисками в некоторых международных стандартах



Измерение рисков


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

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

РИСК = P происшествия * ЦЕНА ПОТЕРИ

Если переменные являются количественными величинами, то риск — это оценка математического ожидания потерь.

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

Определяется субъективная шкала вероятностей событий, например:
A - Событие практически никогда не происходит
B - Событие случается редко
C - Вероятность события за рассматриваемый промежуток времени – около 0.5
D - Скорее всего, событие произойдет
E - Событие почти обязательно произойдет

Кроме того, определяется субъективная шкала серьезности происшествий, например:
N (Negligible) – Воздействием можно пренебречь
Mi (Minor) – Незначительное происшествие: последствия легко устранимы, затраты на ликвидацию последствий невелики, воздействие на информационную технологию –незначительно.
Mo (Moderate) – Происшествие с умеренными результатами: ликвидация последствий не связана с крупными затратами, воздействие на информационную технологию невелико и не затрагивает критически важные задачи.
S (Serious) – Происшествие с серьезными последствиями: ликвидация последствий связана со значительными затратами, воздействие на информационные технологии ощутимо, воздействует на выполнение критически важных задач.
C (Critical) – Происшествие приводит к невозможности решения критически важных задач.

Для оценки рисков определяется шкала из трех значений:


Низкий риск Средний риск Высокий риск

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

Таблица 2. Определение риска в зависимости от двух факторов
Negligible Minor Moderate Serious Critical
A Низкий риск Низкий риск Низкий риск Средний риск Средний риск
B Низкий риск Низкий риск Средний риск Средний риск Высокий риск
C Низкий риск Средний риск Средний риск Средний риск Высокий риск
D Средний риск Средний риск Средний риск Средний риск Высокий риск
E Средний риск Высокий риск Высокий риск Высокий риск Высокий риск
Шкалы факторов риска и сама таблица могут быть определены иначе, иметь другое число градаций. Подобный подход к оценке рисков достаточно распространен.

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

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

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

Угроза — совокупность условий и факторов, которые могут стать причиной нарушения целостности, доступности, конфиденциальности информации.

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

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

Р происшествия = Р угрозы * Р уязвимости

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

РИСК = P угрозы * Р уязвимости * ЦЕНА ПОТЕРИ

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


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

Например, показатель риска измеряется в шкале от 0 до 8 со следующими определениями уровней риска:

1 — риск практически отсутствует. Теоретически возможны ситуации, при которых событие наступает, но на практике это случается редко, а потенциальный ущерб сравнительно невелик.

2 — риск очень мал. События подобного рода случались достаточно редко, кроме того, негативные последствия сравнительно невелики.

......

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

Матрица может быть определена следующим образом:

Таблица 3. Определение риска в зависимости от трех факторов
Степень
серьезности
происшествия
(цена потери)
Уровень угрозы
Низкий Средний Высокий
Уровни уязвимостей Уровни уязвимостей Уровни уязвимостей
Н С В Н С В Н С В
Negligible 0 1 2 1 2 3 2 3 4
Minor 1 2 3 2 3 4 3 4 5
Moderate 2 3 4 3 4 5 4 5 6
Serious 3 4 5 4 5 6 5 6 7
Critical 4 5 6 5 6 7 6 7 8
В данной таблице уровни уязвимости Н, С, В соответственно означают: низкий, средний, высокий уровень. Подобные таблицы используются как в «бумажных» вариантах методик оценки рисков, так и в различного рода инструментальных средствах – ПО анализа рисков.
В последнем случае матрица задается разработчиками ПО и, как правило, не подлежит корректировке. Это один из факторов, ограничивающих точность подобного рода инструментария.


Экономически оправданная безопасность


Сергей Петренко, Сергей Симонов, журнал "IT Manager" #15(3)/2004

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



Классы контрмер CRAMM (фрагмент)


Masquerading of User Identity by Insiders


Identification and Authentication
Logical Access Control
Accounting
Audit
Object Re-use
Security Testing
Software Integrity
Mobile Computing and Teleworking
Software Distribution
System Input/Output Controls
Network Access Controls
System Administration Controls
Application Input/Output Controls
Back-up of Data
Personnel
Security Education and Training
Security Policy
Security Infrastructure
Data Protection Legalisation
Incident Handling
Compliance Checks

Masquerading of User Identity by Contracted Service Providers


Identification and Authentication
Logical Access Control
Accounting
Audit
Object Re-use
Security Testing
Software Integrity
Mobile Computing and Teleworking
Software Distribution
System Input/Output Controls
Network Access Controls
System Administration Controls
Application Input/Output Controls
Back-up of Data
Personnel
Security Education and Training
Security Policy
Security Infrastructure
Outsourcing
Data Protection Legalisation
Incident Handling
Compliance Checks

Masquerading of User Identity by Outsiders


Identification and Authentication
Logical Access Control
Accounting
Audit
Object Re-use
Security Testing
Software Integrity
Mobile Computing and Teleworking
Software Distribution
System Input/Output Controls
Network Security Management
Network Access Controls
System Administration Controls
Application Input/Output Controls
Back-up of Data
Security Education and Training
Security Policy
Security Infrastructure
Data Protection Legalisation
Incident Handling
Compliance Checks

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

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

Таблица 4. Ориентировочная эффективность мероприятий в области защиты информации по критерию ROI (Return of Investment – возврат вложений)

Разработка и внедрение политики информационной безопасности 2
Мероприятия по работе с персоналом (наведение справок,

контроль за поведением и т. п.)
3
Совершенствование организационной структуры 4
Анализ рисков 5
Управление жизненным циклом (управление рисками) 5
Совершенствование должностных инструкций и условий контрактов 5
Меры контроля за посетителями 6
Управление имуществом компании 7
Обучение персонала и контроль за соблюдением режима ИБ 9
Меры контроля за работой приложений 10
Указанные в таблице значения являются ориентировочными оценками эффективности вложений в различные классы мероприятий в области защиты информации.

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


Оценивание рисков


При оценивании рисков рекомендуется рассматривать следующие аспекты:

Шкалы и критерии, по которым можно измерять риски. Оценка вероятностей событий. Технологии измерения рисков.

Шкалы и критерии, по которым измеряются риски. Для измерения какого-либо свойства необходимо выбрать шкалу. Шкалы могут быть прямыми (естественными) или косвенными (производными). В качестве примера прямых шкал назовем шкалы для измерения физических величин, скажем - литры для измерения объемов, метры для измерения длины. В ряде случаев прямых шкал не существует, приходится использовать либо прямые шкалы других свойств, связанных с интересующими нас, либо определять новые шкалы. Примером является шкала для измерения субъективного свойства «ценность информационного ресурса». Она может измеряться в производных шкалах, таких, как стоимость восстановления ресурса, время восстановления ресурса, и других. Еще один вариант – определить шкалу для получения экспертной оценки, например имеющую три значения:

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

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


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

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

Субъективные шкалы могут быть количественными и качественными, но на практике обычно используются качественные шкалы с 3-7 градациями. С одной стороны, это просто и удобно, с другой – требует грамотного подхода к обработке данных.

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

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


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

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

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

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

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


Оценка уязвимости


Ответьте на вопросы:

1. Сколько людей имеют право пользоваться информационной системой?

Варианты ответов

a От 1 до 10 0 b От 11 до 50 4 c От 51 до 200 10 d От 200 до 1000 14 e Свыше 1000 20

2. Будет ли руководство осведомлено о том, что люди, работающие под их началом, ведут себя необычным образом?

Варианты ответов

a Да 0 b Нет 10

3. Какие устройства и программы доступны пользователям?

Варианты ответов

a Только терминалы или сетевые контроллеры, ответственные за предоставление и маршрутизацию информации, но не за передачу данных -5 b Только стандартное офисные устройства и программы и управляемые с помощью меню подчиненные прикладные программы 0 c Пользователи могут получить доступ к операционной системе, но не к компиляторам 5 d Пользователи могут получить доступ к компиляторам 10

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

Варианты ответов

a Да 10 b Нет 0

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

Варианты ответов

a Менее 10 человек 0 b От 11 до 20 человек 5 c Свыше 20 человек 10

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

Варианты ответов

a Да 0 b Нет 10

7. Насколько велики официально предоставленные пользователям возможности по просмотру всех хранящихся в системе данных?

Варианты ответов

a Официальное право предоставлено всем пользователям -2 b Официальное право предоставлено только некоторым пользователям 0

8. Насколько необходимо пользователям знать всю информацию, хранящуюся в системе?

Варианты ответов

a Всем пользователям необходимо знать всю информацию -4 b Отдельным пользователям необходимо знать лишь относящуюся к ним информацию 0



Ответьте на вопросы


1. Сколько раз за последние три года сотрудники организации пытались получить несанкционированный доступ к хранящейся в информационной системе информации с использованием прав других пользователей?

Варианты ответов

a Ни разу 0 b Один или два раза 10 c В среднем раз в год 20 d В среднем чаще одного раза в год 30 e Неизвестно 10

2. Какова тенденция в статистике такого рода попыток несанкционированного проникновения в информационную систему?

Варианты ответов

a К возрастанию 10 b Остается постоянной 0 c К снижению -10

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

Варианты ответов

a Да 5 b Нет 0

4. Известны ли случаи нападения, угроз, шантажа, давления на сотрудников со стороны посторонних лиц?

Варианты ответов

a Да 10 b Нет 0

5. Существуют ли среди персонала группы лиц или отдельные лица с недостаточно высокими моральными качествами?

Варианты ответов

a Нет, все сотрудники отличаются высокой честностью и порядочностью 0 b Существуют группы лиц и отдельные личности с недостаточно высокими моральными качествами, но это вряд ли может спровоцировать их на несанкционированное использование системы 5 c Существуют группы лиц и отдельные личности с настолько низкими моральными качествами, что это повышает вероятность несанкционированного использования системы сотрудниками 10

6. Хранится ли в информационной системе информация, несанкционированное изменение которой может принести прямую выгоду сотрудникам?

Варианты ответов

a Да 5 b Нет 0

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

Варианты ответов

a Нет 0 b Да 5

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

Варианты ответов

a Да -10 b Нет 0

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

Варианты ответов

a Да -10 b Нет 0

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

Варианты ответов

a Ни разу 0 b Один или два раза 5 c В среднем раз в год 10 d В среднем чаще одного раза в год 15 e Неизвестно 10



Степень угрозы при количестве баллов:


До 9 Очень низкая От 10 до 19 Низкая От 20 до 29 Средняя От 30 до 39 Высокая 40 и более Очень высокая



Степень уязвимости при количестве баллов:


До 9 Низкая От 10 до 19 Средняя 20 и более Высокая



Технология оценки угроз и уязвимостей


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

Экспертные оценки. Статистические данные. Учет факторов, влияющих на уровни угроз и уязвимостей.

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

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

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



Возможности и ограничения данного подхода


Несомненное достоинство данного подхода — возможность учета множества косвенных факторов (и не только технических). Методика проста и дает владельцу информационных ресурсов ясное представление, каким образом получается итоговая оценка и что надо изменить, чтобы улучшить показатели.

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

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

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



Выбор допустимого уровня риска


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

Первый подход типичен для базового уровня безопасности. Уровень остаточных рисков не принимается во внимание. Затраты на программно-технические средства защиты и организационные мероприятия, необходимые для соответствия информационной системы спецификациям базового уровня (антивирусное ПО, МЭ, системы резервного копирования, системы контроля доступа) являются обязательными, их целесообразность не обсуждается. Дополнительные затраты (если такой вопрос будет поставлен по результатам проведения аудита ИБ либо по инициативе службы безопасности) должны находиться в разумных пределах и не превышать 5-15% средств, которые тратятся на поддержание работы информационной системы.

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

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

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

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



Выбор контрмер и оценка их эффективности


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



в определении характеристик рисков корпоративной


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

Идентификация/аутентификация с помощью биометрических данных


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

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

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

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

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

Активность в области биометрии очень велика. Организован соответствующий консорциум (см. http://www.biometrics.org/), активно ведутся работы по стандартизации разных аспектов технологии (формата обмена данными, прикладного программного интерфейса и т.п.), публикуется масса рекламных статей, в которых биометрия преподносится как средство обеспечения сверхбезопасности, ставшее доступным широким массам.

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

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


Лекция из курса Основы информационной безопасности


В.А.Галатенко

Интернет Университет Информационных Технологий, INTUIT.ru



Одноразовые пароли


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

Наиболее известным программным генератором одноразовых паролей является система S/KEY компании Bellcore. Идея этой системы состоит в следующем. Пусть имеется односторонняя функция f (то есть функция, вычислить обратную которой за приемлемое время не представляется возможным). Эта функция известна и пользователю, и серверу аутентификации. Пусть, далее, имеется секретный ключ K, известный только пользователю.

На этапе начального администрирования пользователя функция f применяется к ключу K n раз, после чего результат сохраняется на сервере. После этого процедура проверки подлинности пользователя выглядит следующим образом:

сервер присылает на пользовательскую систему число (n-1); пользователь применяет функцию f к секретному ключу K (n-1) раз и отправляет результат по сети на сервер аутентификации; сервер применяет функцию f к полученному от пользователя значению и сравнивает результат с ранее сохраненной величиной. В случае совпадения подлинность пользователя считается установленной, сервер запоминает новое значение (присланное пользователем) и уменьшает на единицу счетчик (n).

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

Система S/KEY имеет статус Internet-стандарта (RFC 1938).

Другой подход к надежной аутентификации состоит в генерации нового пароля через небольшой промежуток времени (например, каждые 60 секунд), для чего могут использоваться программы или специальные интеллектуальные карты (с практической точки зрения такие пароли можно считать одноразовыми). Серверу аутентификации должен быть известен алгоритм генерации паролей и ассоциированные с ним параметры; кроме того, часы клиента и сервера должны быть синхронизированы.



Основные понятия


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

Идентификация позволяет субъекту (пользователю, процессу, действующему от имени определенного пользователя, или иному аппаратно-программному компоненту) назвать себя (сообщить свое имя).

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

(Заметим в скобках, что происхождение русскоязычного термина "аутентификация" не совсем понятно. Английское "authentication" скорее можно прочитать как "аутентикация"; трудно сказать, откуда в середине взялось еще "фи" - может, из идентификации? Тем не менее, термин устоялся, он закреплен в Руководящих документах Гостехкомиссии России, использован в многочисленных публикациях, поэтому исправить его уже невозможно.)

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

В сетевой среде, когда стороны идентификации/аутентификации территориально разнесены, у рассматриваемого сервиса есть два основных аспекта:

что служит аутентификатором (то есть используется для подтверждения подлинности субъекта); как организован (и защищен) обмен данными идентификации/аутентификации.

Субъект может подтвердить свою подлинность, предъявив по крайней мере одну из следующих сущностей:

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


В открытой сетевой среде между сторонами идентификации/аутентификации не существует доверенного маршрута; это значит, что в общем случае данные, переданные субъектом, могут не совпадать с данными, полученными и использованными для проверки подлинности. Необходимо обеспечить защиту от пассивного и активного прослушивания сети, то есть от перехвата, изменения и/или воспроизведения данных. Передача паролей в открытом виде, очевидно, неудовлетворительна; не спасает положение и шифрование паролей, так как оно не защищает от воспроизведения. Нужны более сложные протоколы аутентификации.

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

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

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

Любопытно отметить, что сервис идентификации / аутентификации может стать объектом атак на доступность.Если система сконфигурирована так, что после определенного числа неудачных попыток устройство ввода идентификационной информации (такое, например, как терминал) блокируется, то злоумышленник может остановить работу легального пользователя буквально несколькими нажатиями клавиш.



идентификатор субъекта ( идентификатор пользователя, сетевой адрес компьютера и т.п.). Подобные идентификаторы являются основой произвольного (или дискреционного) управления доступом; атрибуты субъекта (метка безопасности, группа пользователя и т.п.). Метки безопасности - основа принудительного (мандатного) управления доступом.

Матрицу доступа, ввиду ее разреженности (большинство клеток - пустые), неразумно хранить в виде двухмерного массива. Обычно ее хранят по столбцам, то есть для каждого объекта поддерживается список "допущенных" субъектов вместе с их правами. Элементами списков могут быть имена групп и шаблоны субъектов, что служит большим подспорьем администратору. Некоторые проблемы возникают только при удалении субъекта, когда приходится удалять его имя из всех списков доступа; впрочем, эта операция производится нечасто.

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

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



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

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

Удобной надстройкой над средствами логического управления доступом является ограничивающий интерфейс, когда пользователя лишают самой возможности попытаться совершить несанкционированные действия, включив в число видимых ему объектов только те, к которым он имеет доступ. Подобный подход обычно реализуют в рамках системы меню (пользователю показывают лишь допустимые варианты выбора) или посредством ограничивающих оболочек, таких как restricted shell в ОС Unix.

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


Парольная аутентификация


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

Чтобы пароль был запоминающимся, его зачастую делают простым (имя подруги, название спортивной команды и т.п.). Однако простой пароль нетрудно угадать, особенно если знать пристрастия данного пользователя. Известна классическая история про советского разведчика Рихарда Зорге, объект внимания которого через слово говорил "карамба"; разумеется, этим же словом открывался сверхсекретный сейф.

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

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

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

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

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

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

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



Ролевое управление доступом


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

Таким решением является ролевое управление доступом (РУД). Суть его в том, что между пользователями и их привилегиями появляются промежуточные сущности - роли. Для каждого пользователя одновременно могут быть активными несколько ролей, каждая из которых дает ему определенные права (см. рис. 10.2).


Рис. 10.2. 

Пользователи, объекты и роли.

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

Ролевой доступ развивается более 10 лет (сама идея ролей, разумеется, значительно старше) как на уровне операционных систем, так и в рамках СУБД и других информационных сервисов. В частности, существуют реализации ролевого доступа для Web-серверов.

В 2001 году Национальный институт стандартов и технологий США предложил проект стандарта ролевого управления доступом (см. http://csrc.nist.gov/rbac/), основные положения которого мы и рассмотрим.

Ролевое управление доступом оперирует следующими основными понятиями:

пользователь (человек, интеллектуальный автономный агент и т.п.);

сеанс работы пользователя;

роль (обычно определяется в соответствии с организационной структурой);


объект (сущность, доступ к которой разграничивается; например, файл ОС или таблица СУБД);

операция (зависит от объекта; для файлов ОС - чтение, запись, выполнение и т.п.; для таблиц СУБД - вставка, удаление и т.п., для прикладных объектов операции могут быть более сложными); право доступа (разрешение выполнять определенные операции над определенными объектами).

Ролям приписываются пользователи и права доступа; можно считать, что они (роли) именуют отношения "многие ко многим" между пользователями и правами. Роли могут быть приписаны многим пользователям; один пользователь может быть приписан нескольким ролям. Во время сеанса работы пользователя активизируется подмножество ролей, которым он приписан, в результате чего он становится обладателем объединения прав, приписанных активным ролям. Одновременно пользователь может открыть несколько сеансов.

Между ролями может быть определено отношение частичного порядка, называемое наследованием. Если роль r2 является наследницей r1, то все права r1 приписываются r2, а все пользователи r2 приписываются r1. Очевидно, что наследование ролей соответствует наследованию классов в объектно-ориентированном программировании, только правам доступа соответствуют методы классов, а пользователям - объекты (экземпляры) классов.

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

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


Фрагмент подобной иерархии ролей показан на рис. 10.3.


Рис. 10.3. 

Фрагмент иерархии ролей.

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

Статическое разделение обязанностей налагает ограничения на приписывание пользователей ролям. В простейшем случае членство в некоторой роли запрещает приписывание пользователя определенному множеству других ролей. В общем случае данное ограничение задается как пара "множество ролей - число" (где множество состоит, по крайней мере, из двух ролей, а число должно быть больше 1), так что никакой пользователь не может быть приписан указанному (или большему) числу ролей из заданного множества. Например, может существовать пять бухгалтерских ролей, но политика безопасности допускает членство не более чем в двух таких ролях (здесь число=3).

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

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

Рассматриваемый проект стандарта содержит спецификации трех категорий функций, необходимых для администрирования РУД:



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



Вспомогательные функции (обслуживание сеансов работы пользователей): открыть сеанс работы пользователя с активацией подразумеваемого набора ролей; активировать новую роль, деактивировать роль; проверить правомерность доступа.

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

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

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


Сервер аутентификации Kerberos


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

Kerberos предназначен для решения следующей задачи. Имеется открытая (незащищенная) сеть, в узлах которой сосредоточены субъекты - пользователи, а также клиентские и серверные программные системы. Каждый субъект обладает секретным ключом. Чтобы субъект C мог доказать свою подлинность субъекту S (без этого S не станет обслуживать C), он должен не только назвать себя, но и продемонстрировать знание секретного ключа. C не может просто послать S свой секретный ключ, во-первых, потому, что сеть открыта (доступна для пассивного и активного прослушивания), а, во-вторых, потому, что S не знает (и не должен знать) секретный ключ C. Требуется менее прямолинейный способ демонстрации знания секретного ключа.

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

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

между Kerberos и субъектами и как субъекты хранят свои секретные ключи - вопрос отдельный.

Проиллюстрируем описанную процедуру.


Рис. 10.1.

Проверка сервером S подлинности клиента C.

Здесь c и s - сведения (например, имя), соответственно, о клиенте и сервере, d1 и d2 - дополнительная (по отношению к билету) информация, Tc.s - билет для клиента C на обслуживание у сервера S, Kc и Ks - секретные ключи клиента и сервера, {info}K - информация info, зашифрованная ключом K.

Приведенная схема - крайне упрощенная версия реальной процедуры проверки подлинности. Более подробное рассмотрение системы Kerberos можно найти, например, в статье В. Галатенко "Сервер аутентификации Kerberos (Jet Info, 1996, 12-13). Нам же важно отметить, что Kerberos не только устойчив к сетевым угрозам, но и поддерживает концепцию единого входа в сеть.


Управление доступом в Java-среде


Java - это объектно-ориентированная система программирования, поэтому и управление доступом в ней спроектировано и реализовано в объектном стиле. По этой причине рассмотреть Java-среду для нас очень важно. Подробно о Java-технологии и безопасности Java-среды рассказано в статье А. Таранова и В. Цишевского "Java в три года" (Jet Info, 1998, 11-12). С разрешения авторов далее используются ее фрагменты.

Прежде всего, остановимся на эволюции модели безопасности Java. В JDK 1.0 была предложена концепция "песочницы" (sandbox) - замкнутой среды, в которой выполняются потенциально ненадежные программы (апплеты, поступившие по сети). Программы, располагающиеся на локальном компьютере, считались абсолютно надежными, и им было доступно все, что доступно виртуальной Java-машине.

В число ограничений, налагаемых "песочницей", входит запрет на доступ к локальной файловой системе, на сетевое взаимодействие со всеми хостами, кроме источника апплета, и т.п. Независимо от уровня достигаемой при этом безопасности (а проблемы возникали и с разделением свой/чужой, и с определением источника апплета), наложенные ограничения следует признать слишком обременительными: возможности для содержательных действий у апплетов почти не остается.

Чтобы справиться с этой проблемой, в JDK 1.1 ввели деление источников (точнее, распространителей) апплетов на надежные и ненадежные (источник определялся по электронной подписи). Надежные апплеты приравнивались в правах к "родному" коду. Сделанное послабление решило проблемы тех, кому прав не хватало, но защита осталась неэшелонированной и, следовательно, неполной.

В JDK 1.2 сформировалась модель безопасности, используемая и в Java 2. От модели "песочницы" отказались. Оформились три основных понятия:

источник программы; право и множество прав;

политика безопасности.

Источник программы определяется парой (URL, распространители программы). Последние задаются набором цифровых сертификатов.

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

Политика безопасности задает соответствие между источником и правами поступивших из него программ (формально можно считать, что каждому источнику соответствует своя "песочница"). В JDK 1.2 "родные" программы не имеют каких-либо привилегий в плане безопасности, и политика по отношению к ним может быть любой. В результате получился традиционный для современных ОС и СУБД механизм прав доступа со следующими особенностями:

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

Весьма важным понятием в модели безопасности JDK 1.2 является контекст выполнения. Когда виртуальная Java-машина проверяет права доступа объекта к системному ресурсу, она рассматривает не только текущий объект, но и предыдущие элементы стека вызовов. Доступ предоставляется только тогда, когда нужным правом обладают все объекты в стеке. Разработчики Java называют это реализацией принципа минимизации привилегий.

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

К сожалению, подобные доводы противоречат одному из основных принципов объектного подхода - принципу инкапсуляции.


Если объект A обращается к объекту B, он не может и не должен знать, как реализован B и какими ресурсами он пользуется для своих целей. Если A имеет право вызывать какой-либо метод B с некоторыми значениями аргументов, B обязан обслужить вызов. В противном случае при формировании политики безопасности придется учитывать возможный граф вызовов объектов, что, конечно же, нереально.

Разработчики Java осознавали эту проблему. Чтобы справиться с ней, они ввели понятие привилегированного интервала программы. При выполнении такого интервала контекст игнорируется. Привилегированная программа отвечает за себя, не интересуясь предысторией. Аналогом привилегированных программ являются файлы с битами переустановки идентификатора пользователя/группы в ОС Unix, что лишний раз подтверждает традиционность подхода, реализованного в JDK 1.2. Известны угрозы безопасности, которые привносят подобные файлы. Теперь это не лучшее средство ОС Unix перекочевало в Java.

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

Класс AccessController (встроенный менеджер безопасности) предоставляет единый метод для проверки заданного права в текущем контексте - checkPermission (Permission). Это лучше (по причине параметризуемости), чем множество методов вида checkXXX, присутствующих в SecurityManager - динамически изменяемом менеджере безопасности из ранних версий JDK.

Пусть текущий контекст выполнения состоит из N стековых фреймов (верхний соответствует методу, вызвавшему checkPermission(p)). Метод checkPermission реализует следующий алгоритм (см. Листинг 10.1).

i = N; while (i > 0) { if (метод, породивший i-й фрейм, не имеет проверяемого права) { throw AccessControlException } else if (i-й фрейм помечен как привилегированный) { return; } i = i - 1; }; // Выясним, есть ли проверяемое право у унаследованного контекста inheritedContext.checkPermission (p);

Листинг 10.1. Алгоритм работы метода checkPermission класса AccessController. (, )

Сначала в стеке ищется фрейм, не обладающий проверяемым правом.


Проверка производится до тех пор, пока либо не будет исчерпан стек, либо не встретится "привилегированный" фрейм, созданный в результате обращения к методу doPrivileged(PrivilegedAction) класса AccessController. Если при порождении текущего потока выполнения был сохранен контекст inheritedContext, проверяется и он. При положительном результате проверки метод checkPermission(p) возвращает управление, при отрицательном возникает исключительная ситуация AccessControlException.

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

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

В целом средства управления доступом в JDK 1.2 можно оценить как "наполовину объектные". Реализация оформлена в виде интерфейсов и классов, однако по-прежнему разграничивается доступ к необъектным сущностям - ресурсам в традиционном понимании. Не учитывается семантика доступа. Имеют место и другие отмеченные выше концептуальные проблемы.


Возможный подход к управлению доступом в распределенной объектной среде


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

традиционные модели (дискреционная и мандатная); модель "песочница" (предложенная для Java-среды и близкой ей системы Safe-Tcl); модель фильтрации (используемая в межсетевых экранах).

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

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

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

С каждым объектом ассоциирован набор интерфейсов, снабженных дескрипторами (ДИ). К объекту можно обратиться только посредством ДИ. Разные интерфейсы могут предоставлять разные методы и быть доступными для разных объектов.

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

Объекты изолированы друг от друга. Единственным видом межобъектного взаимодействия является вызов метода.

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

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

Разграничивается доступ к интерфейсам объектов, а также к методам объектов (с учетом значений фактических параметров вызова). Правила разграничения доступа (ПРД) задаются в виде предикатов над объектами.

Рассматривается задача разграничения доступа для выделенного контейнера CC, компонентами которого должны являться вызывающий и/или вызываемый объекты.
ДИ этого контейнера полагается общеизвестным. Считается также, что между внешними по отношению к выделенному контейнеру объектами возможны любые вызовы.

Выполнение ПРД контролируется монитором обращений.

При вызове метода мы будем разделять действия, производимые вызывающим объектом (инициация вызова) и вызываемым методом (прием и завершение вызова).

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

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

Структурируем множество всех ПРД, выделив четыре группы правил:

политика безопасности контейнера; ограничения на вызываемый метод; ограничения на вызывающий метод;

добровольно налагаемые ограничения.

Правила, общие для всех объектов, входящих в контейнер C, назовем политикой безопасности данного контейнера.

Пусть метод M1 объекта O1 в точке P1 своего выполнения должен вызвать метод M объекта O. Правила, которым должен удовлетворять M, можно разделить на четыре следующие подгруппы:

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

Метод M объекта O, потенциально доступный для вызова, может предъявлять к вызывающему объекту следующие группы требований:

правила, описывающие требования к фактическим параметрам вызова; правила, накладывающие ограничения на вызывающий объект.

Можно выделить три разновидности предикатов, соответствующих семантике и/или особенностям реализации методов:

утверждения о фактических параметрах вызова метода M в точке P1; предикат, описывающий семантику метода M; предикат, описывающий особенности реализации метода M.

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

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