My name is Vasyl Khrystiuk‎ > ‎process‎ > ‎main‎ > ‎

3 Java app security

Структура цикла:
  1. Intro - о чем вообще речь
  2. Risks in web-apps
  3. Java app security - что ява предлагает из коробки для защиты приложений
  4. j2ee webapp security - что ява предлагает из коробки для защиты веб приложений
  5. Auth and auth flow, remember me, access managers models(role-based, unix fs ownership based, vote-based)
  6. custom auth framework
  7. spring security and friends(Apache Shiro)

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

Криптография

Криптография - все разновидности криптографичесских алгоритмов:
  • хеширование(Message digest algorithms)
  • цифровые подписи(Digital signature algorithms)
  • симметричные блоковые алгоритмы(Symmetric bulk encryption)
  • симметричные потоковые алгоритмы(Symmetric stream encryption)
  • ассиметричесские алгоритмы(Asymmetric encryption)
  • шифрование на основании пароля(Password-based encryption (PBE))
  • алгоритмы генерации ключей(Key generators)
  • алгоритмы соглашения ключей для обмена(Key agreement algorithms)(вот некая дока)
  • имитовставка(Message Authentication Codes (MACs))
  • псевдо-генераторы((Pseudo-)random number generators)
Да, все это есть в наборе явы по дефолту.
Если по какому-то пункту есть вопросы, то более детальная информация в гугле(как обычно) или еще есть хорошая книга "Java Security" by Scott Oaks или вот: http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html

Инфраструктура публичных ключей

    Инфраструктура публичных ключей - поддержка работы с публичными ключами и сертификатами. Тут и класс для работы с KeyStore: java.security.KeyStore, и с самими сертификатами непосредственно: java.security.cert.CertStore, есть поддержка как стандартных KeyStore(PKCS specifications from RSA Security) так и собственный формат хранилищ  JKS ("Java Key Store"), еще есть поддержка LDAP и даже хранилище в памяти! А так в наборе явы есть несколько инструментов для генерации таких сертификатов(keytool) и подписывания ними jar-архивов(jarsigner). 

Аутентификация и авторизация

    Аутентификация и авторизация тоже поддерживается  из коробки. Для поддержки этих задач в стандартном наборе есть целый фреймворк "Java Authentication and Authorization Service" (JAAS). Фреймворк конечно не оригинальный, и является адаптацией PAM для явы(тут правда не совсем понятно, что есть адаптацией чего, ибо оба продукта PAM и JAAS разработаны одной и той же компанией примерно в одно и то же время)
    Идея построения аутентификации в том, что приложение, которое вызывает аутентификацию - ничего не знает о том, как именно она происходит, что делает использование стандартных интерфейсов очень удобным. Класс javax.security.auth.login.LoginContext используется для получения необходимого логин-хандлера, внутренняя реализация которого типа javax.security.auth.spi.LoginModule собственно производит аутентификацию. При этом всякое взаимодействие с пользователем/файлами/устройствами производится через массив калбек-функкций, которые передаются LoginContext при создании. 
В наборе есть некоторые стандартные каллбек функции:
com.sun.security.auth.callback.DialogCallbackHandler - красивое swing окошко для запроса логина/пароля.
com.sun.jmx.remote.security.JMXPluggableAuthenticator.JMXCallbackHandler - для обработки аутентификации во время JMX подключения. 
com.sun.security.auth.callback.TextCallbackHandler  - консоль 

Так же в пакете есть несколько стандартных аутентификаторов(наследники javax.security.auth.spi.LoginModule):
Krb5LoginModule для аутентификации с помощью протокола Kerberos
com.sun.security.auth.module.JndiLoginModule - для аутентификации с помощью логина/пароля в LDAP or NIS базах
KeyStoreLoginModule - по названию понятно
com.sun.jmx.remote.security.FileLoginModule - поддержка удаленного логина в jmx с помощью локального файла ${java.home}/lib/management/jmxremote.password

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

Вот пример сферического кода аутентивикации из учебников
код тут
вот пример сферического кода авторизации из учебников
код тут


Защищенное соединение

Есть поддержка SSL/TLS, есть даже целый javax.net.ssl.SSLSocket, и даже его правильная реализация от NIO - это javax.net.ssl.SSLEngine. Для организации работы с ключами и центрами сертификации есть соответственные менеджеры: javax.net.ssl.KeyManager и javax.net.ssl.TrustManager .

Есть поддержка SASL(Simple Authentication and Security Layer), но что это такое?
Есть поддержка GSS-API and Kerberos , но что это такое?

Контроль доступа

В яве есть встроенный механизм для контроля доступа выполняемого кода. Все решения относительно контроля доступа управляются с помощью специального менеджера безопасности. представленного классом java.lang.SecurityManager. Таким образом сомнительному коду можно запретить, например запись файлов, чтение файлов, создание внешних соединений и так дальше. Ярким примером работы этакого менеджера являются java-апплеты  в браузерах. Эта инфраструктура поддерживает конфигурирование с помощью специальных файлов. Там в нутри все есть - и java.security.Permission, и java.security.Policy, и  "Secure Class Loading"(загрузка кода отдельными класслоадерами и ассоциация кода с источником его получения) "Privileged Blocks API"(вызовы, которые должны выполниться не смотря на ограничение вызывающего кода, например отрисовка шрифтов их файлов, даже если прав на чтение файлов нет) и прочие моменты. 


Выводы

Вся писанина выше - это краткий пересказ документации, ссылку на которую я дал в начале. Я выбирал и выписывал все оттуда для того, чтоб ознакомиться с возможностями Java для создания безопасных и защищенных приложений. И как оказалось - возможности очень и очень огромные. Не смотря на то, что наша цель это создание безопасного веб-приложения на Java, а не десктопного, то может показаться, что все это нам не нужно. Но это не так. Десктопная появилась раньше, вебприложения на яве - позже. Но никто не любит изобретать колесо и потому при построении безопасных веб-приложений используются те же компоненты, что использовались и при построении безопасного дестопного приложения. Из очевидного - криптография и SSL, но и другие компоненты тоже используются, а некоторые и вообще являются ключевыми - например  java.security.Principal, Role


В следующей части мы рассмотрим общеизвестные проблемы безопасности вебприложений, а так же на месте посмотрим, что и как это решается с помощью java 2ee
https://code.google.com/p/secure-taglib




Источник

http://docs.oracle.com/javase/7/docs/technotes/guides/security/


В чем еще разобраться

Kerberos
Java GSS-API
PKCS#11
JSSE
PKI
SASL
XML Digital Signature
JMX auth/auth
но надо ли


Comments