Об авторах
Джим Яворски является президентом компании JSPWare.com, в которой он консультирует фирмы, входящие в список Fortune 100, по вопросам создания безопасных Web-приложений на Java. Он является также профессиональным разработчиком Java-программ и сертифицированным компанией Sun программистом, разработчиком и конструктором. Джим Яворски написал много популярных книг по Java и JavaScript, в том числе Java 2 Platform Unleashed и Mastering JavaScript and JScript. Он также ведет рубрику SuperScripter на Web-узле Builder.com — специализированном Web-узле для Web-разработчиков, созданном компанией CNET.
Пол Дж. Перроун является основателем, президентом и главным консультантом по программированию компании Assured Technologies, Inc. Компания Assured Technologies (http://www.assuredtech.com) осуществляет консультирование, подготовку персонала, исследования и разработку продуктов по заказам компаний, заинтересованных в высоконадежных, безопасных, высокотехнологичных, экономичных, масштабируемых, базирующихся на использовании Internet распределенных корпоративных системах для электронной коммерции и корпоративных приложений общего назначения. Высокий профессиональный уровень Пола в области высокотехнологичных и высоконадежных (в том числе безопасных) систем отчетливо виден в исследованиях и разработках компании Assured Technologies. Пол сыграл ключевую роль в проектировании, конструировании и разработке множества крупномасштабных многоуровневых распределенных систем и продуктов как для организаций средних масштабов, так и для крупных корпораций, входящих в список Fortune 500. Ключевыми областями учебной и практической деятельности Пола являются корпоративное ПО на Java и J2EE, технологии EJB, CORBA, XML, UML, встроенные средства взаимодействия корпоративных систем, а также объектно-ориентированное и модульное ПО. Помимо данной книги, Пол является автором книги Создание корпоративных систем на основе Java 2 Enterprise Edition. Руководство разработчика , докладов на конференции JavaOne и множества публикаций в различных специализированных изданиях. Он имеет ученую степень магистра в области электроники, присужденную ему университетом штата Виргиния, и бакалавра в области электроники, присужденную ему университетом Рутгерса (Rutgers University). Он является членом Института инженеров по электротехнике и электронике IEEE (Institute of Electrical and Electronics Engineers) и ассоциации по вычислительной технике ACM (Association for Computing Machinery) и широко известен в научных кругах Северной Виргинии. Связаться с Полом можно по электронной почте ([email protected]) или по телефону (703)728-0115.
Венката С. Р. Кришна Чаганти разработал многие из кодов, используемых в качестве примеров в главах 3, 9 и 13 данной книги. Кришна является старшим консультантом в области программного обеспечения, и в течение последних семи лет разрабатывает распределенное ПО на Java и C++. Кришна сотрудничает с рядом крупных компаний, входящих к список Fortune 500, разрабатывая по их заказам ПО на базе технологий EJB, CORBA и DCE для распределенной обработки данных. Кришна также преподает язык Java и связанные с ним технологии. Он имеет степень магистра в области программирования и степень магистра в области электротехники, присужденные ему университетом штата Алабама (Хантсвилл). Он также имеет степень бакалавра в области электроники и связи университета Нагарьяна (Nagarjuna University, A.P.) в Индии. Адрес его электронной почты: [email protected].
Введение
Многие программисты предпочитают разрабатывать Web-приложения и корпоративные службы на Java. С момента своего появления язык Java привлекал разработчиков поддержкой аплетов и расширенными возможностями API-интерфейса, ставшими доступными с появлением версии 1.0 инструментального набора разработчика JDK. Его привлекательность усилилась с появлением технологии LiveConnect компании Netscape, позволяющей писать сценарии для аплетов с помощью технологии JavaScript, усовершенствований, внесенных в язык с появлением набора JDK 1.1, и многочисленных возможностей, которыми была дополнена версия 1.1 API. Эти усовершенствования включают в себя технологию JavaBeans, обеспечивающую механизм разработки компонентов, как использующих графический интерфейс пользователя, так и не имеющих его, Java-технологию удаленного вызова RMI, создавшую фундамент для связи распределенных объектов, и технологию JDBC, которая расширила возможности Java-аплетов и приложений в работе с базами данных.
В наборе JDK 1.2 возможности, имевшиеся в JDK 1.1, были улучшены, и, кроме того, он был дополнен такими новыми возможностями, как поддержка технологий Swing, Java 2D, Drag and Drop, Collections и CORBA, что сделало Java еще более мощным и привлекательным языком. JDK 1.2 был переименован в Java 2 Platform. Программная платформа для разработки корпоративных приложений, носящая название Java 2 Platform, Enterprise Edition (J2EE), помимо всего прочего, поддерживает такие технологии, как сервлеты, Java Server Pages (JSP), Enterprise JavaBeans, службы каталогом и имен, транзакции, электронную почту, и обеспечивает много других особенностей. Возможности, которыми обладает J2EE, превратили Java 2 Platform в платформу, широко используемую для разработки Web-приложений и распределенных корпоративных служб.
Хотя широкие возможности, предоставляемые Java 2 API, уже сами по себе являются более чем достаточным основанием для выбора этого языка, Java является также превосходным языком и рабочей средой для разработки защищенных приложений. С момента появления Java безопасность была основным фактором, с учетом которого разрабатывался этот язык программирования, система выполнения, API-интерфейс и набор утилит. В наборе JDK 1.0 для защиты мобильного кода была заложена технология "песочницы". Именно это, в первую очередь, обеспечило успех Java как языка разработки Web-приложений. Набор JDK 1.1, вдобавок к этому, обеспечил поддержку подписанных аплетов, которые могли работать вне "песочницы", не нарушая безопасности аплетов. JDK 1.1 был также дополнен возможностями работы с дайджестами сообщений, цифровыми подписями и цифровыми сертификатами.
В JDK 1.1 в интерфейс безопасности Security API платформы Java 2 были внесены некоторые изменения, а также добавлена поддержка конфигурируемых политик безопасности приложений и аплетов, цифровых сертификатов стандарта X.509 версии 3 и дополнительной обработки сертификатов. Java 2 Security API предоставляет также новые инструменты задания политик безопасности, подписания кодов и управления сертификатами.
Возможности обеспечения безопасности, обеспечиваемые платформой Java 2 Platform, были усилены множеством разнообразных расширений безопасности.
- Криптографическое расширение Java (Java Cryptography Extension) — JCE 1.2 является основой для разработки алгоритмов шифрования, алгоритмов создания криптографических ключей алгоритмов согласования ключей, и алгоритмов аутентификации. Он также предоставляет реализации множества популярных криптографических алгоритмов.
- Расширение защищенных сокетов Java (Java Secure Socket Extension) — JSSE обеспечивает Java-реализацию протокола защищенных сокетов SSL v.3 (Secure Sockets Layer) и защищенного транспортного протокола TLS версии 1 (Transport Layer Security). Эти протоколы могут быть использованы для дополнительной защиты используемых Internet-протоколов, таких, например, как HTTP, telnet и POP3.
- Служба аутентификации и авторизации Java (Java Authentication and Authorization Service) — JAAS, поддерживает аутентификацию пользователей и управление доступом. Она поддерживает Java-реализацию технологии встраиваемых аутентификационных модулей PAM (Pluggable Authentication Module), а также классов и интерфейсов для управления допуском пользователей к выполнению важных, с точки зрения безопасности, программ.
При совместном использовании, Java 2 Security API, JCE 1.2, JSSE и JAAS создают всеобъемлющую основу для разработки безопасных распределенных Web-приложений. Объединяя мощные возможности и функциональную гибкость API-интерфейсов J2EE, вы получаете все, что требуется для разработки совершенных приложений как для Web, так и для корпоративной intranet.
Важность системы безопасности Java
Для многих организаций, как государственных, так и коммерческих, Internet стала важнейшим рабочим компонентом. Она занимает важнейшее место в рекламе, маркетинге, торговле и обслуживании клиентов. Internet способствует быстрейшему расширению новых предприятий и помогает крупному бизнесу расширить его влияние на рынке. И наоборот, для предприятий, которые не торопятся использовать Internet, последствия этой медлительности бывают иногда весьма болезненными.
При всех потенциальных благах, которые несет в себе Internet, она таит в себе и заметные опасности. Web-серверами подвержены опасности захвата управления ими, а Web-страницы могут быть испорчены. Конфиденциальная клиентская информация подвержена опасности разглашения. Финансовые транзакции могут быть фальсифицированы. Корпоративные брандмауэры могут быть прорваны и корпоративные сети станут объектами диверсий. Насколько важно для бизнеса использование Internet, настолько же, если не больше, важно для него делать это в безопасности.
Java, в роли языка программирования для Web, занимает центральное место как инструмент разработки безопасных Web-приложений. Java-аплеты обеспечивают возможность доставки выполняемых программ Web-броузерам. JSP и сервлеты обеспечивают возможность безопасной обработки запросов броузеров. Технология JDBC обеспечивает безопасный доступ Web-приложений к корпоративным базам данных. Технология EJB обеспечивает основу для безопасной реализации бизнес-приложений. Технологии RMI и CORBA на платформе Java создают основу для развертывания распределенных объектов. Интерфейс безопасности Java Security API и его расширения, предназначенные для обеспечения защиты, дают возможность реализации и выполнения полностью распределенных Web-приложений безопасным путем. Тем, кому требуется разрабатывать защищенные Web-приложения, Java предоставляет для этого широкие возможности.
Мне бы хотелось сказать здесь, что Java, по своим возможностям обеспечения безопасности, намного опережает своих конкурентов. Но я не могу сказать этого, потому что конкурентов попросту нет. Технология аутентифицируемого кода (authenticode), предлагаемая компанией Microsoft для защиты мобильного кода, базируется исключительно на добрых намерениях Web-разработчиков. Эта технология не препятствует установке поврежденного кода. Она всего лишь требует, чтобы код был надлежащим образом подписан. Это аналогично требованию указывать обратный адрес на посылке с миной.
Если Java доминирует в сфере клиентских программ, то в сфере серверных программ его влияние еще больше. Java-сервлеты и JSP являются технологиями программирования, предназначенными исключительно для серверов и обладающими средствами самозащиты. Если в вашем сценарии, написанном с помощью Perl, ASP или ColdFusion, имеются слабые места в защите, хороший хакер может оказаться в состоянии воспользоваться ими для захвата управления сервером. Сервлеты и серверные Java-страницы могут быть настроены для реализации минимальных привилегий. Это означает, что пользователям предоставляются только те привилегии, которые необходимы им для выполнения их функций, и ничего более. Если в защите надежно сконфигурированного сервлета имеется слабое место и он используется, у хакера будет возможность лишь получить привилегии этого сервлета (но ничего больше).
Способность ограничить ущерб является еще более важной особенностью, чем даже способность предотвратить его. Заложенные в конструкцию языка программирования Java средства обеспечения безопасности, его объектно-ориентированная природа и защитные возможности исполняемой среды Java — направлены на то, чтоб помочь разработчикам ПО создавать его более простым, более надежным и менее подверженным ошибкам в защите.
Защитные возможности Java распространяются не только на клиенты и Web-серверы, но и дальше — на базы данных, логику приложений и корпоративные объекты, используемые Web-приложениями. Технологии JDBC и JSSE обеспечивают Web-клиенты и серверы возможностью безопасного подключения к серверным базам данных. Технология EJB создает основу для безопасного развертывания компонентов приложений. Технологии RMI и CORBA могут быть объединены с JSSE для поддержки безопасной связи распределенных объектов.
Обширные возможности API-интерфейса Java и встроенные средства обеспечения безопасности integrated делают его ключевой технологией для обеспечения безопасности как глобальных, так и локальных сетей. Хотя другие технологии, возможно, и могут быть использованы для частичной защиты важных Web-приложений, это решение, скорее всего, окажется более дорогостоящим, менее переносимым и менее наращиваемым. Сравните приложение, в котором в клиентской программе используется технология ActiveX, CGI-сценарии, написанные на Perl, драйверы баз данных, написанные на Oracle, и заказной сервер приложений, с ПО, базирующемся на аплетах, JSP, JDBC и EJB. Как вы думаете, какое из них будет более безопасным, более производительным, более переносимым и более простым в эксплуатации?
Добиться высокого уровня безопасности Web-приложений в большинстве случаев далеко не просто. В противном случае мы не читали бы постоянно о взломах Web-систем. Для хорошей защиты требуется тщательное планирование, прочная архитектура, хорошо структурированная конструкция и почти безошибочная реализация. Для этого также требуется, чтобы проектная и рабочая среды были ориентированы на обеспечение безопасности. Платформа The Java 2 Platform предоставляет такие инструменты разработки и среду выполнения. Из этой книги вы узнаете о том, как использовать платформу Java 2 Platform для разработки надежных приложений, в которые на стадии замысла и конструирования заложена защита как их неотъемлемая особенность.
Для кого предназначена эта книга
Эта книга предназначена для тех, перед кем стоит задача — разработать и реализовать защищенное Java-приложение или аплет. Если вы достаточно опытный Java-программист и вам требуется изучить, каким образом обеспечить безопасность ваших Java-приложений, эта книга — для вас. Она позволит вам ликвидировать любые пробелы в ваших знаниях исполняемой среды Java и интерфейса безопасности Security API. Она познакомит вас также с такими расширениями безопасности, как JCE 1.2, JSSE и JAAS. Наряду с этими знаниями вы приобретете практический опыт, обогащенный созданием Java-приложений, использующих преимущества таких возможностей обеспечения безопасности, как подписание кода, шифрование, аутентификация, авторизация и управление доступом, предоставляемые этими API-интерфейсами.
Вы узнаете о том, как применять Java-инструменты защиты для разработки подписанных аплетов, защищенных сервлетов и безопасной связи с корпоративными базами данных. Вы узнаете о том, как дополнить имеющиеся Java-приложения технологией SSL, как надежно аутентифицировать ваших пользователей и реализовать персональное и групповое управление доступом. Вы узнаете о том, как дополнить мерами защиты приложения электронной коммерции, обеспечить безопасный доступ к распределенным объектам с помощью технологий RMI и CORBA, и использовать преимущества средств безопасности, предоставляемых технологией Enterprise JavaBeans.
В дополнение к тому, что вы приобретете знания и практические навыки, необходимые для разработки защищенных Java-приложений, с помощью этой книги вы выработаете профессиональный подход к этим проблемам. Основательно разобравшись в логической основе защитных возможностей Java, вы сможете использовать их наиболее эффективно, избегать опасных ловушек и создавать на практике заведомо надежные и безопасные приложения.
Структура этой книги
Эта книга состоит из трех частей и включает в себя 15 глав. Вспомогательная информация и дополнительные подробности, относящиеся к вопросам, рассматриваемым в них, приведены в семи приложениях.
Часть I, "Основы безопасности Java", является введением в принципы, лежащие в основе системы безопасности Java. Она включает следующие главы.
- Глава 1, "Азбука безопасности". Обсуждаются базовые принципы, лежащие в основе безопасности, и описывается базовая модель построения безопасных приложений.
- Глава 2, "Обзор системы безопасности Java". Приведен краткий обзор возможностей обеспечения безопасности, заложенных в Java, и описано, каким образом эти возможности используются для создания безопасных Java-приложений и аплетов.
- Глава 3, "Управление доступом для обеспечения безопасности Java-приложений". Рассказывается, как применить в Java-приложениях механизмы тщательного, базирующегося на политиках безопасности управления доступом, предоставляемые платформой Java 2.
- Глава 4, "Безопасность аплетов". Рассматриваются стандартная политика безопасности и способы расширения этой политики с использованием подписанного кода аплета.
Часть II, "Криптографическая защита" охватывает криптографические возможности Java 2 API, криптографического расширения Java — JCE 1.2 (Java Cryptography Extension) и расширения защищенных сокетов Java — JSSE (Java Secure Socket Extension). Здесь также рассматриваются криптографические пакеты, предоставляемые не компанией Sun, а другими разработчиками. В часть II включены следующие главы.
- Глава 5, "Введение в криптографию". Представляет собой краткое знакомство с основными концепциями криптографии и описывает, как они поддерживаются платформой Java 2 и криптографическим расширением JCE 1.2.
- Глава 6, "Управление ключами и цифровые сертификаты". Знакомит с основными принципами управления ключами и описывает, как Java 2 поддерживает этот механизм.
- Глава 7, "Дайджесты сообщений и цифровые подписи". Рассказывает о том, как использовать возможности Java 2 для работы с дайджестами сообщений, цифровыми подписями и цифровыми сертификатами.
- Глава 8, "Криптографическое расширение Java". Представляет обзор пакета JCE 1.2, описывает его возможности и то, как использовать JCE и альтернативные сервис-провайдеры.
- Глава 9, "Протокол SSL и расширение защищенных сокетов JSSE". Знакомит с SSL и JSSE и демонстрирует примеры того, как они используются для защиты связи "клиент/сервер".
Часть III, "Криптографическая защита" посвящена безопасности распределенных систем. Она охватывает вопросы, относящиеся к безопасности сетей, баз данных, службе аутентификации и авторизации JAAS, технологиям CORBA, EJB, JSP и Java-сервлетам. Эта часть книги состоит из следующих глав.
- Глава 10, "Обзор безопасности распределенных корпоративных систем". Обзор базовых API-интерфейсов Java распределенных корпоративных систем и средств, с помощью которых их можно защитить.
- Глава 11, "Базы данных и обеспечение их безопасности". Определяются основные вопросы безопасности баз данных и способы реализации защиты баз данных с помощью JDBC.
- Глава 12, "Служба аутентификации и авторизации Java" знакомит с JAAS и использованием ее в Java-приложениях.
- Глава 13, "Система безопасности архитектуры CORBA". Обсуждаются вопросы разработки CORBA-приложений, базирующихся на Java, с использованием стандартных служб безопасности CORBA.
- Глава 14, "Безопасность технологии Enterprise JavaBeans". Обсуждаются вопросы обеспечения безопасности с помощью технологии EJB и методы разработки безопасных EJB-компонентов.
- Глава 15, "Система безопасности Java-сервлетов и JSP-компонентов". Рассматриваются вопросы безопасности, связанные с интерфейсом общего шлюза — CGI (Common Gateway interface), и варианты защиты Web-приложений, разработанных с использованием технологий сервлетов и JSP.
В семи приложениях представлена вспомогательная информация — от математических основ до информации по установке криптографических расширений Java. Список этих приложений приведен ниже.
- Приложение А, "Летопись упущений, выявленных в системе безопасности Java". Собрание всех известных недоработок в системе безопасности Java.
- Приложение Б, "Математический аппарат алгоритма RSA". Представлены математические основы криптографической системы RSA.
- Приложение В, "Загрузка и установка пакета JCE". Пошаговая инструкция по загрузке и установке пакета JCE.
- Приложение Г, "API-интерфейс безопасности на платформе Java 2". Обзор классов и интерфейсов , входящих в API-интерфейс безопасности Java2 Security API.
- Приложение Д, "Загрузка и установка пакета Cryptix 3.1 в качестве альтернативы JCE 1.2". Пошаговая инструкция по загрузке и установке пакетов Cryptix, альтернативных JCE 1.2.
- Приложение Е, "Использование утилиты keytool". Инструкция по использования Java-утилиты keytool.
- Приложение Ж, "Использование утилиты jarsigner". Инструкция по использованию Java-утилиты jarsigner.
В дополнение к главам и приложениям этой книги, на Web-узле по адресу http://www.courseone.com/support/books/java/security представлены обновления, исправления и текущая информация по безопасности Java. По адресу http://www.assuredtech.com/books/jsh вы найдете дополнительную информацию, относящуюся к специфическим вопросам безопасности распределенных корпоративных систем Java.
Приступаем к изучению
Для того чтобы работать с этой книгой, вам потребуется компьютер и операционная система, поддерживающая платформу Java 2 Platform. Эту платформу поддерживает великое множество ОС, в том числе Windows 2000, NT, 98 и 95, Linux и Solaris. Варианты платформы Java 2 Platform для других операционных систем разрабатываются в данное время. Примеры, приведенные в этой книге, были разработаны под ОС Windows 98, Windows NT, и Linux. Однако, так как они целиком написаны на Java, будут работать под всеми ОС, поддерживающими Java 2 Platform. Для обновления листингов кодов обращайтесь на Web-узел, посвященный этой книге.
Как пользоваться этой книгой
Эта книга охватывает все аспекты безопасности Java. Вы можете сразу же перейти к любой главе, в которой рассматриваются вопросы, интересующие вас более всего. Но мы рекомендует начать с чтения глав части I, "Основы безопасности Java", которая охватывает основы безопасности Java, работу системы выполнения, политики безопасности Java и вопросы безопасности, общие для любых Java-приложений. Если вы поступите так, как мы рекомендуем, то получите солидную основу для понимания механизмов обеспечения безопасности, применяемых и в других областях использования Java API.
После изучения основ, приведенных в части I книги, мы рекомендуем прочитать часть II, "Криптографическая защита" — особенно главу 5, "Введение в криптографию". Для изучения многих возможностей обеспечения безопасности Java необходимо понимание основ криптографии, дайджестов сообщений, цифровых подписей и цифровых сертификатов. Помимо этого, в приложениях собрана обширная информация общего характера, имеющая отношение к концепциям и средствам, представленным в части II книги.
После изучения глав части II, у вас будет достаточная подготовка для понимания информации, приведенной в главах части III, "Безопасность распределенных систем". В части III книги собрана большая часть средств обеспечения безопасности распределенных корпоративных систем, которые представляют интерес для разработчиков корпоративного ПО, с их специфическими нуждами, обусловленными необходимостью развития корпоративных систем с использованием Java.