Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Нижегородский государственный технический университет
Институт радиоэлектроники и информационных технологий
Кафедра «Информатика и системы управления»
Методы и средства защиты компьютерной информации
«Система безопасности Java»
Нижний Новгород, 2007
1. Принцип работы Java
2. Защита Java-аплетов
3. Модель безопасности JDK1.2
4. Криптографическая архитектура Java
5. Объектная организация механизмов безопасности
Список используемой литературы
1. Принцип работы Java
В основе технологии Java лежит клиент-серверная модель, а Java-программа состоит из нескольких блоков, каждый из которых выполняет определенную часть общей задачи. На стороне клиента присутствуют только те блоки, которые необходимы в данный момент. Причем наиболее часто используемые блоки хранятся в кэше на жестком диске или в оперативной памяти компьютера пользователя. Поскольку блок загружается с сервера, то и управлять такой системой можно с сервера, т. е. централизованно. Это также гарантирует, что пользователь всегда будет использовать самую последнюю версию программы.
Основной компонент этой технологии - виртуальный Java-процессор, который представляет собой среду для исполнения Java-команд, или так называемых байт-кодов. Любая Java-программа должна соответствовать спецификации виртуального Java-процессора, которая полностью определяет систему команд Java, типы данных, обрабатываемых Java-процессором, и его регистры.
Кроме виртуального процессора, технология Java включает в себя (в качестве необязательного элемента) объектно-ориентированный язык программирования, построенный на основе языка C++, к которому добавили новые механизмы для обеспечения безопасности и распределенных вычислений.
Особенностью Java являются аплеты. Аплет - это небольшая программка, в которой должно быть определено несколько обязательных функций. Аплет загружается по сети и может выполняться на Web-браузере, который поддерживает язык Java. Именно эта часть Java-технологии предназначена для использования во всемирной сети Internet, и поэтому защита должна распространяться как на сам аплет, так и на клиента сети, который использует этот аплет.
2. Защита Java -аплетов
Наиболее уязвимыми с точки зрения безопасности компонентом Java-технологии являются аплеты, поскольку их может использовать любой клиент. Именно поэтому для аплетов предусмотрены самые жесткие методы защиты. Хотя различные браузеры и программы просмотра аплетов могут по-разному защищать информацию пользователя от нападения, но в общем случае аплету должно быть запрещено следующее:
· проверять существование и параметры определенного файла;
· осуществлять доступ по сети к удаленному компьютеру;
· получать список сетевых сеансов связи, которые устанавливает локальный компьютер с другими компьютерами;
· получать сведения о пользователе или его домашней директории;
· выходить из интерпретатора Java;
Эти правила обеспечивают следующие компоненты Java-технологии.
· Собственно виртуальный Java-процессор, который постоянно контролирует свое состояние.
· Загрузчик аплетов и Java-программ, который контролирует загружаемые коды.
· Диспетчер безопасности (Secu-rityManager), контролирующий и блокирующий опасные действия аплетов.
В классе SecurityManager перечислены методы, которые используются системой для контроля действий аплета в зависимости от характеристик окружающей среды
Функция загрузчика - верификация байт-кодов, т. е. проверка правильности полученного элемента Java-программы и его целостности. В процессе верификации выясняется следующее:
· соответствует ли версия полученного блока версиям остальных элементов системы;
· соответствует ли программа спецификации конкретного виртуального Java-процессора;
Целями такой проверки являются выявление неправильного использования косвенной адресации, которое может привести к нарушению в работе виртуального процессора, и проверка целостности аплета.
Защитные механизмы этой технологии очень хорошо продуманы, но их реализация еще далека от совершенства. Поэтому далее приведен небольшой список возможных "нападений".
Блокировка сервиса
В результате этого частично или полностью блокируется работа пользователя и даже может быть выведен из строя браузер. Вот далеко не полный список возможных вариантов такого "нападения":
· заполнение всей свободной памяти;
· захват важных системных классов.
"Тайные" каналы
Эти каналы позволяют получать информацию даже через систему защиты (брандмауэры). Существование "тайных" каналов в браузере делает его очень опасным. В качестве "тайного" канала можно использовать следующие действия аплетов:
· посылку почты через SMTP-порт сервера (причем почта посылается от имени пользователя, который работает с аплетом);
· запрос на поиск по несуществующему URL-адресу, в котором в качестве параметров передаются необходимые "взломщику" данные;
· попытку доступа по несуществующему адресу (последовательность директорий может содержать необходимые данные).
Информация, известная аплетам
С помощью этой информации можно получить некоторые сведения, которые впоследствии могут быть им использованы для "взлома". Эту информацию можно передавать даже через брандмауэры по тайным каналам, которые описаны выше. Аплетам обычно известна следующая системная информация:
· системное время;
· название и версия операционной системы;
· архитектура процессора.
Установить баланс между возможностями загружаемых аплетов и защитой клиентской системы довольно сложно. Предлагаемые решения невозможно сделать независимыми от конкретной платформы, что противоречит требованию абсолютной переносимости Java-программ.
3. Модель безопасности JDK 1.2
В Java-технологии предусмотрен целый ряд защитных рубежей, которые можно разделить на три группы:
· надежность языка;
· контроль при получении и загрузке программ;
· контроль при выполнении программ.
Java обеспечивает безопасность за счет средств статического и динамического контроля. Еще одно Java -- автоматическое управление памятью, исключающее появление "висячих" указателей.
Контроль при получении и загрузке программ носит в Java многоступенчатый характер. Во-первых, программные компоненты могут снабжаться электронной подписью, что позволяет контролировать их целостность и аутентичность. Во-вторых, верификатор байт-кодов, кроме общей проверки формата поступившей информации, пытается убедиться в отсутствии следующих некорректных действий:
· подделка указателей (например, получение указателя как результат выполнения арифметической операции);
· нарушение прав доступа к компонентам классов;
· вызов методов объектов с недопустимым набором параметров;
· недопустимое преобразование типов;
· переполнение или исчерпание стека.
Контроль при выполнении программ можно разделить на два уровня. На нижнем уровне виртуальная Java-машина не допускает выходов за границы массивов и аналогичных некорректных действий. На верхнем уровне менеджер безопасности выполняет содержательные проверки правомерности доступа, реализуя тем самым выбранную политику безопасности.
Если продолжить деление на группы и уровни, то полезно выделить следующие два аспекта Java-безопасности:
· защита Java-окружения времени выполнения и ресурсов аппаратно-программной платформы от вредоносного программного обеспечения;
· разграничение доступа субъектов к ресурсам прикладного уровня.
Основная цель мер безопасности в Java -- обеспечить защиту Java-окружения от вредоносных программ. Для достижения этой цели была предложена концепция "песочницы" (sandbox ) -- замкнутой среды, в которой выполняются потенциально ненадежные программы. Таковыми считались аплеты, поступившие по сети. Весь "родной" код (то есть программы, располагающиеся на локальном компьютере) считался абсолютно надежным и ему было доступно все, что доступно виртуальной Java-машине.
В число ограничений, налагаемых "песочницей", входит запрет на доступ к локальной файловой системе, на сетевое взаимодействие со всеми хостами, кроме источника аплета (хост, с которого аплет был получен) и т.д. При таких ограничениях безопасность в общем и целом обеспечивается, но возможности для работы у аплетов почти не остается.
Чтобы как-то справиться с этой проблемой, ввели понятие электронной подписи, которую ставит распространитель аплета. Java-машина в соответствии со своей политикой безопасности делит распространителей и, соответственно, их аплеты на две категории -- надежные и ненадежные. Надежные аплеты были приравнены в правах к "родному" коду.
Оформились три основных понятия:
· источник программы;
· право и множество прав;
· политика безопасности.
Источник программы определяется парой (универсальный локатор ресурсов -- URL, распространители программы). URL может указывать на файл в локальной файловой системе или же на ресурс удаленной системы.
Право -- это абстрактное понятие, за которым, как обычно в Java, стоят классы и объекты. В большинстве случаев право определяется двумя цепочками символов -- именем ресурса и действием. Например, в качестве ресурса может выступать файл, а в качестве действия -- чтение.
Политика безопасности задает соответствие между источником и правами поступивших из него программ. "Родные" программы не имеют каких-либо привилегий в плане безопасности и политика по отношению к ним может быть любой.
По сути имеется традиционный для современных операционных систем и систем управления базами данных механизм прав доступа со следующими особенностями:
· Субъектом доступа является не пользователь, а источник программы. Впрочем, формально можно считать, что во время исполнения программы ее источник становится;
· Нет понятия владельца ресурса, который (владелец) мог бы менять права; последние задаются исключительно политикой безопасности.
Модель безопасности в JDK 1.2
4. Криптографическая архитектура Java
Без криптографии невозможны надежная аутентификация, контроль целостности и сохранение конфиденциальности.
Криптографическая архитектура Java (Java Cryptography Architecture, JCA) разработана для предоставления следующих сервисов:
· постановка/проверка электронной подписи;
· вычисление хэш-функции;
· генерация пар ключей открытый/секретный;
· создание сертификатов, подтверждающих аутентичность открытых ключей;
· хранение ключей, а также сертификатов надежных партнеров;
· преобразование ключей из представления со скрытой структурой в общепонятное представление и наоборот;
· генерация параметров криптографических алгоритмов;
· генерация (псевдо)случайных чисел;
· выработка общего ключевого материала.
Кроме того, криптографическая архитектура должна удовлетворять следующим технологическим требованиям:
· обеспечивать независимость от алгоритмов и их реализаций;
· обеспечивать взаимную совместимость реализаций;
· обеспечивать расширяемость набора алгоритмов и их реализаций.
Каждый сервис может обеспечиваться несколькими алгоритмами, каждый из которых, в свою очередь, может иметь несколько реализаций. Например, для вычисления хэш-функции предназначены алгоритмы MD5/SHA-1 (равно как и российский ГОСТ "Функция хэширования"), для выработки и проверки электронной подписи -- алгоритмы RSA/DSA, российский ГОСТ "Процедуры выработки и проверки электронной цифровой подписи" и т.д.
Программный интерфейс сервисов построен так, чтобы отразить их функциональность в алгоритмически-независимой форме. Для обозначения реализаций используется понятие поставщика криптографических услуг -- пакета или группы пакетов, содержащих реализацию. Приложение имеет возможность выбирать алгоритмы и поставщиков услуг из числа доступных.
Два последних элемента в списке сервисов (симметричное шифрование и выработка общего ключевого материала) подвержены экспортным ограничениям США, поэтому они, в отличие от остальных перечисленных сервисов, оформлены как расширение (Java Cryptography Extension, JCE), являющееся отдельным продуктом.
Иерархия криптографических сервисов, алгоритмов и реализаций
5. Объектная орга низация механизмов безопасности
java аплет защита криптографический
Механизмы безопасности в JDK 1.2 оформлены в виде четырех основных пакетов и трех пакетов расширения. Вот некоторые из них
· java.security -- содержит интерфейсы и классы, составляющие каркас механизмов безопасности. Сюда входят рассмотренные выше средства разграничения доступа, а также криптографические средства, такие как выработка электронной подписи, вычисление хэш-функции и т.п.
· java.security.interfaces -- средства генерации RSA- и DSA-ключей.
· javax.crypto -- интерфейс и классы для симметричного шифрования.
Наиболее важные с концептуальной точки зрения интерфейсы и классы сосредоточены в пакете java.security .
Политика безопасности
Политика безопасности в устанавливает соответствие между источниками программ и их правами доступа. В Java-машине в каждый момент времени она представлена одним объектом класса, являющегося преемником абстрактного класса Policy . Методы класса Policy позволяют получить/установить текущую политику, а также выяснить права доступа, ассоциированные с заданным источником программ.
Проверка прав доступа
Для контроля прав доступа можно пользоваться двумя средствами:
· встроенным менеджером безопасности, получившим название AccessController ;
· динамически изменяемым менеджером безопасности -- SecurityManager .
Класс AccessController предоставляет единый метод для проверки заданного права в текущем контексте -- checkPermission.
Криптографические интерфейсы и классы
Объектная организация криптографической подсистемы Java естественным образом отражает описанную выше криптографическую. Каждому сервису соответствует абстрактный класс, описывающий его (сервиса) программный интерфейс, а также класс, описывающий программный интерфейс поставщика сервиса. Важными являются классы Provider и Security . В первом собраны общие методы поставщиков криптографических услуг, во втором -- методы управления поставщиками и параметрами алгоритмов.
Список используемой литературы
1. http://www.jetinfo.ru/1998/11-12/1/article1.11-12.19981237.html
2. http://vestnik.sci.pfu.edu.ru/archiv-cs/articles-cs/2004-3-1/pdf/kulyabov-2004.pdf
3. http://ru.wikipedia.org/wiki/Java
4. http://infocity.kiev.ua/hack/content/hack081.phtml
5. http://citforum.uar.net/security/web/java_seq.shtml
6. http://www.htc-cs.ru/press/tribune/java.html
7. http://www.ccc.ru/magazine/depot/00_11/print.html?web3.htm
Размещено на Allbest.ru
Архитектура Java и Java RMI, их основные свойства, базовая система и элементы. Безопасность и виртуальная Java-машина. Интерфейс Java API. Пример использования приложения RMI. Работа с программой "Calculator". Универсальность, портативность платформ.
курсовая работа , добавлен 03.12.2013
Понятие и функциональные особенности Java Card как версии Java-платформы для устройств с крайне ограниченными вычислительными ресурсами, оценка ее возможностей и необходимых ресурсов. Анализ степени безопасности платформы, взаимодействие компонентов.
презентация , добавлен 19.05.2014
Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.
курсовая работа , добавлен 10.11.2014
История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.
курсовая работа , добавлен 14.12.2012
Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.
методичка , добавлен 30.06.2009
Архитектура уровня команд платформы Java, формат файла класса Java. Компилятор ассемблероподобного языка, позволяющий создавать файлы классов, корректно обрабатываемые реальной JVM, поддерживающий все команды байт-кода Java и важнейшие возможности JVM.
курсовая работа , добавлен 17.09.2008
Кратка историческая справка развития языка Java. Анализ предметной области. Java platform, enterprise and standart edition. Апплеты, сервлеты, gui-приложения. Розработка программного кода, консольное приложение. Результаты работы апплета, сервлета.
курсовая работа , добавлен 23.12.2015
Преимущество использования программ, написанных на Java, требования к ним и настройки на клиентском ПК. Развертывание и последующее "автоматическое" обновление версий GUI клиента с помощью использования технологии Java Web Start в среде Windows.
реферат , добавлен 16.05.2011
Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.
курсовая работа , добавлен 19.07.2014
Расширяемый язык разметки XML. Описание типа документа DTD. Значение XML и платформы Java. Обзор стандартных анализаторов DOM и SAX. Технология Java Servlet, Java Server Pages (JSP), JavaBeans. Общая функциональность программного продукта. Модель данных.
Итак, Java обладает длинной и непростой историей развития, однако настало время рассмотреть, что же получилось у создателей, какими свойствами обладает данная технология.
Самое широко известное, и в то же время вызывающее самые бурные споры, свойство - много- или кроссплатформенность . Уже говорилось, что оно достигается за счет использования виртуальной машины JVM , которая является обычной программой, исполняемой операционной системой и предоставляющей Java -приложениям все необходимые возможности. Поскольку все параметры JVM специфицированы, то остается единственная задача - реализовать виртуальные машины на всех существующих и используемых платформах.
Наличие виртуальной машины определяет многие свойства Java , однако сейчас остановимся на следующем вопросе - является Java языком компилируемым или интерпретируемым? На самом деле, используются оба подхода.
Исходный код любой программы на языке Java представляется обычными текстовыми файлами, которые могут быть созданы в любом текстовом редакторе или специализированном средстве разработки и имеют расширение.java. Эти файлы подаются на вход Java -компилятора, который транслирует их в специальный Java байт-код . Именно этот компактный и эффективный набор инструкций поддерживается JVM и является неотъемлемой частью платформы Java .
Результат работы компилятора сохраняется в бинарных файлах с расширением.class. Java -приложение, состоящее из таких файлов, подается на вход виртуальной машине, которая начинает их исполнять, или интерпретировать, так как сама является программой.
Многие разработчики поначалу жестко критиковали смелый лозунг Sun "Write once, run everywhere", обнаруживая все больше и больше несоответствий и нестыковок на различных платформах. Однако надо признать, что они просто были слишком нетерпеливы. Java только появилась на свет, а первые версии спецификаций были недостаточно исчерпывающими.
Очень скоро специалисты Sun пришли к выводу, что просто свободно публиковать спецификации (что уже делалось задолго до Java ) недостаточно. Необходимо еще и создавать специальные процедуры проверки новых продуктов на соответствие стандартам. Первый такой тест для JVM содержал всего около 600 проверок, через год их число выросло до десяти тысяч и с тех пор все время увеличивается (именно его в свое время не смог пройти MS IE 4.0). Безусловно, авторы виртуальных машин все время совершенствовали их, устраняя ошибки и оптимизируя работу. Все-таки любая, даже очень хорошо задуманная технология требует времени для создания высококачественной реализации. Аналогичный путь развития сейчас проходит Java 2 Micro Edition (J2ME ), но об этом позже.
Следующим по важности свойством является объектная ориентированность Java , что всегда упоминается во всех статьях и пресс-релизах. Сам объектно-ориентированный подход (ООП) рассматривается в следующей лекции, однако важно подчеркнуть, что в Java практически все реализовано в виде объектов - потоки выполнения (threads) и потоки данных (streams), работа с сетью, работа с изображениями, с пользовательским интерфейсом , обработка ошибок и т.д. В конце концов, любое приложение на Java - это набор классов, описывающих новые типы объектов.
Подробное рассмотрение объектной модели Java проводится на протяжении всего курса, однако обозначим основные особенности. Прежде всего, создатели отказались от множественного наследования. Было решено, что оно слишком усложняет и запутывает программы. В языке используется альтернативный подход - специальный тип " интерфейс ". Он подробно рассматривается в соответствующей лекции.
Далее, в Java применяется строгая типизация . Это означает, что любая переменная и любое выражение имеет тип, известный уже на момент компиляции. Такой подход применен для упрощения выявления проблем, ведь компилятор сразу сообщает об ошибках и указывает их расположение в коде. Поиск же исключительных ситуаций (exceptions - так в Java называются некорректные ситуации) во время исполнения программы (runtime) потребует сложного тестирования, при этом причина дефекта может обнаружиться совсем в другом классе. Таким образом, нужно прикладывать дополнительные усилия при написании кода, зато существенно повышается его надежность (а это одна из основополагающих целей, для которых и создавался новый язык).
В Java существует всего 8 типов данных, которые не являются объектами. Они были определены с самой первой версии и никогда не менялись. Это пять целочисленных типов: byte, short, int, long, а также к ним относят символьный char. Затем два дробных типа float и double и, наконец, булевский тип boolean. Такие типы называются простыми, или примитивными (от английского primitive ), и они подробно рассматриваются в лекции, посвященной типам данных. Все остальные типы - объектные или ссылочные (англ. reference ).
Синтаксис Java почему-то многих ввел в заблуждение. Он действительно создан на основе синтаксиса языков C/C++, так что если посмотреть на исходный код программ, написанных на этих языках и на Java, то не сразу удается понять, какая из них на каком языке написана. Это почему-то дало многим повод думать, что Java - это упрощенный C++ с дополнительными возможностями, такими как garbage collector . Автоматический сборщик мусора (garbage collector ) мы рассмотрим чуть ниже, но считать, что Java такой же язык, как и C++,- большое заблуждение.
Конечно, разрабатывая новую технологию, авторы Java опирались на широко распространенный язык программирования по целому ряду причин. Во-первых, они сами на тот момент считали C++ своим основным инструментом. Во-вторых, зачем придумывать что-то новое, когда есть вполне подходящее старое? Наконец, очевидно, что незнакомый синтаксис отпугнет разработчиков и существенно осложнит внедрение нового языка, а ведь Java должна была максимально быстро получить широкое распространение. Поэтому синтаксис был лишь слегка упрощен, чтобы избежать слишком запутанных конструкций.
Но, как уже говорилось, С++ принципиально не годился для новых задач, которые поставили себе разработчики из компании Sun, поэтому модель Java была построена заново, причем в соответствии с совсем другими целями. Дальнейшие лекции будут постепенно раскрывать конкретные различия.
Что же касается объектной модели, то она скорее была построена по образцу таких языков, как Smalltalk от IBM, или разработанный еще в 60-е годы в Норвежском Вычислительном Центре язык Simula, на который ссылается сам создатель Java Джеймс Гослинг.
Другое немаловажное свойство Java - легкость в освоении и разработке - также получило неоднозначную оценку. Действительно, авторы потрудились избавить программистов от наиболее распространенных ошибок, которые порой допускают даже опытные разработчики на C/C++. И первое место здесь занимает работа с памятью.
В Java с самого начала был введен механизм автоматической сборки мусора (от английского garbage collector ). Предположим, программа создает некоторый объект, работает с ним, а дальше наступает момент, когда он больше уже не нужен. Необходимо освободить занимаемую память, чтобы не мешать операционной системе нормально функционировать. В С/С++ это необходимо делать явным образом из программы. Очевидно, что при таком подходе существует две опасности - либо удалить объект, который еще кому-то необходим (и если к нему действительно произойдет обращение, то возникнет ошибка), либо не удалять объект, ставший ненужным, а это означает утечку памяти, то есть программа начинает потреблять все большее количество оперативной памяти.
При разработке на Java программист вообще не думает об освобождении памяти. Виртуальная машина сама подсчитывает количество ссылок на каждый объект, и если оно становится равным нулю, то такой объект помечается для обработки garbage collector . Таким образом, программист должен следить лишь за тем, чтобы не оставалось ссылок на ненужные объекты. Сборщик мусора - это фоновый поток исполнения, который регулярно просматривает существующие объекты и удаляет уже не нужные. Из программы никак нельзя повлиять на работу garbage collector , можно только явно инициировать его очередной проход с помощью стандартной функции. Ясно, что это существенно упрощает разработку программ, особенно для начинающих программистов.
Однако опытные разработчики были недовольны тем, что они не могут полностью контролировать все, что происходит с их системой. Нет точной информации, когда именно будет удален объект, ставший ненужным, когда начнет работать (а значит, и занимать системные ресурсы) поток сборщика мусора и т.д. Но, при всем уважении к опыту таких программистов, необходимо отметить, что подавляющее количество сбоев программ, написанных на С/С++, приходится именно на некорректную работу с памятью, причем порой это случается даже с широко распространенными продуктами весьма серьезных компаний.
Кроме того, особый упор делался на легкость освоения новой технологии. Как уже было сказано, ожидалось (и эти ожидания оправдались, в подтверждение правильности выбранного пути!), что Java должна получить максимально широкое применение, даже в тех компаниях, где никогда до этого не занимались программированием на таком уровне (бытовая техника типа тостеров и кофеварок, создание игр и других приложений для сотовых телефонов и т.д.). Был и целый ряд других соображений. Продукты для обычных пользователей, а не профессиональных программистов, должны быть особенно надежными. Internet стал Всемирной Сетью, поскольку появились непрофессиональные пользователи, а возможность создавать апплеты для них не менее привлекательна. Им требовался простой инструмент для создания надежных приложений.
Наконец, Internet-бум 90-х годов набирал обороты и выдвигал новые, более жесткие требования к срокам разработки. Многолетние проекты, которые были в прошлом обычным делом, перестали отвечать потребностям заказчиков, новые системы надо было создавать максимум за год, а то и за считаные месяцы.
Кроме введения garbage collector , были предприняты и другие шаги для облегчения разработки. Некоторые из них уже упоминались - отказ от множественного наследования, упрощение синтаксиса и др. Возможность создания многопоточных приложений была реализована в первой же версии Java (исследования показали, что это очень удобно для пользователей, а существующие стандарты опираются на телетайпные системы, которые устарели много лет назад). Другие особенности будут рассмотрены в следующих лекциях. Однако то, что создание и поддержка систем действительно проще на Java , чем на C/C++, давно является общепризнанным фактом. Впрочем, все-таки эти языки созданы для разных целей, и каждый имеет свои неоспоримые преимущества.
Следующее важное свойство Java - безопасность . Изначальная нацеленность на распределенные приложения, и в особенности решение исполнять апплеты на клиентской машине, сделали вопрос защиты одним из самых приоритетных. При работе любой виртуальной машины Java действует целый комплекс мер. Далее приводится лишь краткое описание некоторых из них.
Во-первых, это правила работы с памятью. Уже говорилось, что очистка памяти производится автоматически. Резервирование ее также определяется JVM , а не компилятором, или явным образом из программы, разработчик может лишь указать, что он хочет создать еще один новый объект. Указатели по физическим адресам отсутствуют принципиально.
Во-вторых, наличие виртуальной машины-интерпретатора значительно облегчает отсечение опасного кода на каждом этапе работы. Сначала байт-код загружается в систему, как правило, в виде class-файлов. JVM тщательно проверяет, все ли они подчиняются общим правилам безопасности Java и не созданы ли злоумышленниками с помощью каких-то других средств (и не искажены ли при передаче). Затем, во время исполнения программы, интерпретатор легко может проверить каждое действие на допустимость. Возможности классов, которые были загружены с локального диска или по сети, существенно различаются (пользователь легко может назначать или отменять конкретные права). Например, апплеты по умолчанию никогда не получат доступ к локальной файловой системе. Такие встроенные ограничения есть во всех стандартных библиотеках Java .
Наконец, существует механизм подписания апплетов и других приложений, загружаемых по сети. Специальный сертификат гарантирует, что пользователь получил код именно в том виде, в каком его выпустил производитель. Это, конечно, не дает дополнительных средств защиты, но позволяет клиенту либо отказаться от работы с приложениями ненадежных производителей, либо сразу увидеть, что в программу внесены неавторизованные изменения. В худшем случае он знает, кто ответственен за причиненный ущерб.
Совокупность описанных свойств Java позволяет утверждать, что язык весьма приспособлен для разработки Internet- и интранет (внутренние сети корпораций)-приложений.
Наконец, важная отличительная особенность Java - это его динамичность . Язык очень удачно задуман, в его развитии участвуют сотни тысяч разработчиков и многие крупные компании. Основные этапы этого развития кратко освещены в следующем разделе.
Итак, подведем итоги. Java -платформа обладает следующими преимуществами:
Но не следует считать, что более легкое освоение означает, что изучать язык не нужно вовсе. Чтобы писать действительно хорошие программы, создавать большие сложные системы, необходимо четкое понимание всех базовых концепций Java и используемых библиотек. Именно этому и посвящен данный курс.
Сразу оговоримся, что под продуктами здесь понимаются программные решения от компании Sun, являющиеся "образцами реализации" ( reference implementation ).
Итак, впервые Java была объявлена 23 мая 1995 года. Основными продуктами, доступными на тот момент в виде бета-версий, были:
Спецификация языка была составлена настолько удачно, что практически без изменений используется и по сей день. Конечно, было внесено большое количество уточнений, более подробных описаний, были добавлены и некоторые новые возможности (например, объявление внутренних классов), однако основные концепции остаются неизменными. Данный курс в большой степени опирается именно на спецификацию языка.
Спецификация JVM предназначена в первую очередь для создателей виртуальных машин, а потому практически не используется Java -программистами.
JDK долгое время было базовым средством разработки приложений. Оно не содержит никаких текстовых редакторов, а оперирует только уже существующими Java -файлами. Компилятор представлен утилитой javac (java compiler). Виртуальная машина реализована программой java . Для тестовых запусков апплетов существует специальная утилита appletviewer . Наконец, для автоматической генерации документации на основе исходного кода прилагается средство javadoc .
Первая версия содержала всего 8 стандартных библиотек:
Таким образом, все библиотеки начинаются с java , именно они являются стандартными. Все остальные (начинающиеся с com, org и др.) могут меняться в любой версии без поддержки совместимости.
Финальная версия JDK 1.0 была выпущена в январе 1996 года.
Сразу поясним систему именования версий. Обозначение версии состоит из трех цифр. Первой пока всегда стоит 1. Это означает, что поддерживается полная совместимость между всеми версиями 1.х.х. То есть программа, написанная на более старом JDK , всегда успешно выполнится на более новом. По возможности соблюдается и обратная совместимость - если программа откомпилирована более новым JDK , а никакие новые библиотеки не использовались, то в большинстве случаев старые виртуальные машины смогут выполнить такой код.
Вторая цифра изменилась от 0 до 4 (последняя на момент создания курса). В каждой версии происходило существенное расширение стандартных библиотек (212, 504, 1781, 2130 и 2738 - количество классов и интерфейсов с 1.0 по 1.4), а также добавлялись некоторые новые возможности в сам язык. Менялись и утилиты, входящие в JDK .
Наконец, третья цифра означает развитие одной версии. В языке или библиотеках ничего не меняется, лишь устраняются ошибки, производится оптимизация, могут меняться (добавляться) аргументы утилит. Так, последняя версия JDK 1.0 - 1.0.2.
Хотя с развитием версии 1.х ничего не удаляется, конечно, какие-то функции или классы устаревают. Они объявляются deprecated , и хотя они будут поддерживаться до объявления 2.0 (а про нее пока ничего не было слышно), пользоваться ими не рекомендуется.
Вместе с первым успехом JDK 1.0 подоспела и критика. Основные недостатки, обнаруженные разработчиками, были следующими. Во-первых, конечно, производительность. Первая виртуальная машина работала очень медленно. Это связано с тем, что JVM , по сути, представляет собой интерпретатор, который работает всегда медленнее, чем исполняется откомпилированный код. Однако успешная оптимизация, устранившая этот недостаток, была еще впереди. Также отмечались довольно бедные возможности AWT , отсутствие работы с базами данных и другие.
В декабре 1996 года объявляется новая версия JDK 1.1, сразу выкладывается для свободного доступа бета-версия. В феврале 1997 года выходит финальная версия. Что было добавлено в новом выпуске Java ?
Конечно, особое внимание было уделено производительности. Многие части виртуальной машины были оптимизированы и переписаны с использованием Assembler, а не C, как до этого. Кроме того, с октября 1996 года Sun развивает новый продукт - Just-In-Time компилятор, JIT . Его задача - транслировать Java байт-код программы в "родной" код операционной системы. Таким образом, время запуска программы увеличивается, но зато выполнение может ускоряться в некоторых случаях до 50 раз! С июля 1997 года появляется реализация под Windows и JIT стандартно входит в JDK с возможностью отключения.
Были добавлены многие новые важные возможности. JavaBeans - технология, объявленная еще в 1996 году, позволяет создавать визуальные компоненты, которые легко интегрируются в визуальные средства разработки. JDBC (Java DataBase Connectivity) обеспечивает доступ к базам данных. RMI (Remote Method Invocation) позволяет легко создавать распределенные приложения. Были усовершенствованы поддержка национальных языков и система безопасности .
За первые три недели JDK 1.1 был скачан более 220.000 раз, менее чем через год - более двух миллионов раз. На данный момент версия 1.1 считается полностью устаревшей и ее развитие остановилось на 1.1.8. Однако из-за того, что самый распространенный браузер MS IE до сих пор поддерживает только эту версию, она продолжает использоваться для написания небольших апплетов .
Кроме того, с 11 марта 1997 года компания Sun начала предлагать Java Runtime Environment , JRE (среду выполнения Java ). По сути дела, это минимальная реализация виртуальной машины, необходимая для исполнения Java -приложений, без компилятора и других средств разработки. Если пользователь хочет только запускать программы, это именно то, что ему нужно.
Как видно, самым главным недостатком осталась слабая поддержка графического интерфейса пользователя (GUI ). В декабре 1996 года компании Sun и Netscape объявляют новую библиотеку IFC (Internet Foundation Classes), разработанную Netscape полностью на Java и предназначенную как раз для создания сложного оконного интерфейса . В апреле 1997 года объявляется, что компании планируют объединить технологии AWT от Sun и IFC от Netscape для создания нового продукта Java Foundation Classes , JFC , в который должны войти:
В данном руководстве мы расскажем обо всём, что нужно знать перед началом изучения программирования на Java . Вы узнаете о возможностях платформы, её применении, а также о том, как правильно начать изучение Java .
В 1991 году «Зелёная команда », подразделение Sun Microsystems , возглавляемое Джеймсом Гослингом , создала язык для программирования бытовых электронных устройств. На тот момент он назывался Oak («Дуб »). Почему «Дуб »? Просто потому, что за окном рабочего кабинета Гослинга росло это дерево.
«Зелёная команда » продемонстрировала использование Oak в интерактивном телевизоре. Но для цифрового кабельного телевидения тех лет эта технология была слишком передовой. Одновременно с этим набирал популярность интернет, для которого новый язык программирования подходил лучше всего.
Через некоторое время новый язык переименовали в Green , и уже после этого - в Java , в честь кофе с острова Ява. Поэтому на логотипе Java изображена кружка с кофе.
Во время разработки Java были популярны C/С++ , поэтому Гослинг сделал синтаксис языка похожим на C/C++ и реализовал для него принцип «написать один раз - запустить где угодно ». В 1995 году Sun Microsystems выпустили первую официальную версию Java . И одновременно с этим было объявлено, что Java войдёт в состав браузера Netscape Navigator .
В 2010 году компания Sun Microsystems вместе с языком программирования Java была приобретена корпорацией Oracle .
Код Java , написанный на одной платформе (то есть операционной системе ), можно запустить без изменений на других платформах.
Для запуска Java используется виртуальная машина Java (Java Virtual Machine, JVM ). JVM обрабатывает байтовый код, после чего процессор обрабатывает код, полученный от JVM . Все виртуальные машины работают аналогично, поэтому один и тот же код работает одинаково во всех операционных системах, что и делает Java межплатформенным языком программирования.
Существуют различные стили программирования, и один из самых популярных - объектно-ориентированное программирование. При таком подходе сложная проблема разбивается на более мелкие путём создания объектов. Благодаря чему код можно использовать повторно.
Объектно-ориентированные функции есть во многих языках программирования, включая Java , Python и C++ . Если вы серьёзно настроены освоить программирование, объектно-ориентированный подход стоит включить в план своего обучения.
Ранние версии языка программирования Java часто критиковали за медленную работу. Но сегодня ситуация кардинально поменялась. Новые версии JVM работают значительно быстрее, а интерпретирующие их процессоры становятся всё шустрее.
Сегодня Java - один из самых быстрых языков программирования. Хорошо оптимизированный Java-код работает почти так же быстро как низкоуровневые языки программирования, такие как C/C++ и намного быстрее, чем Python , PHP и т.д.
Java представляет собой :
Одна из причин широкого распространения Java - огромная стандартная библиотека. В ней можно найти сотни классов и методов из различных пакетов, облегчающих жизнь разработчикам. К примеру,
java.lang – это продвинутые функции для строк, массивов и т.д.
java.util – библиотека для работы со структурами данных, регулярными выражениями, датой и временем и т.д.
kava.io - библиотека для ввода/вывода файлов, обработки исключений и т.д.
Перед обучением Java программированию с нуля , нужно знать, что на это платформе работает более 3 миллиардов устройств по всему миру. Для чего конкретно можно её применить:
Стоит отметить, что эти сайты не обязательно написаны исключительно на Java , и могут использовать и другие языки программирования.
Также программирование на Java используется для разработки игр, научных приложений (к примеру, для обработки естественного языка ) и во многих других областях.
Java – это набор технологий (язык программирования и компьютерная платформа ), предназначенных для создания и запуска программного обеспечения. Однако термином Java часто обозначают и сам язык программирования.
Язык программирования Java – межплатформенный объектно-ориентированный язык программирования общего назначения, обладающий широкими возможностями.
Java 9 – последняя на момент написания данной статьи версия Java .
Java EE , Java Me и Java SE – эти названия обозначают Java Enterprise Edition , Micro Edition и Standard Edition , соответственно.
Java EE нацелена на приложения, запускаемые на серверах. Java ME создана для ограниченных по мощности устройств, таких как встраиваемые устройства. Java SE - стандартное издание Java для написания обычных программ.
Если вы новичок в Java-программировании , рекомендуем начать с Java SE .
JVM — Java Virtual Machine («виртуальная машина Java ») - это программа, позволяющая компьютеру запускать программы, написанные на Java .
JRE – Java Runtime Environment («среда выполнения Java ») включает в себя JVM , соответствующие библиотеки и другие компоненты, необходимые для запуска программ. Но в JRE нет компилятора, отладчика и других средств разработки.
JDK – Java Development Kit (комплект Java разработчика ) содержит JRE и другие инструменты разработки, такие как компиляторы, отладчики и т.д.
Вот что нужно сделать для Java программирование с нуля и установки платформы на Mac OS X или macOS :
Если Java установлена верно, на экран будет выведена версия программы (например, javac 1.8.0_60 ).
Следующим шагом будет установка IDE (интегрированной среды разработки ) для написания и запуска Java-кода . Мы установим бесплатную версию IntelliJ IDEA и запустим на ней Java . Вот что нужно для этого сделать:
Для запуска примеров из уроков программирования с нуля Java на Linux понадобится JAVA SE Development Kit (JDK ) и IDE для разработки своих проектов. Следуйте инструкции шаг за шагом, чтобы начать работу с Java .
Установите Java
sudo add-apt-repository ppa:webupd8team/java
sudo apt update; sudo apt install oracle-java8-installer
Если выводится текущая версия, установка прошла успешно. Если же нет, сверьтесь со страничкой помощи Oracle .
sudo tar xf
cd /opt/
Для освоения Java основ программирования и запуска платформы на Windows потребуется JAVA SE Development Kit (JDK) и IDE для разработки проектов. Следуйте пошаговой инструкции, приведенной ниже:
Чтобы познакомить пользователей с новым языком программирования, используют программу Hello World («Привет, мир! »). Это простая программа, которая выводит на экран слова Hello, World ! В этом разделе мы научим вас писать данную программу на Java , используя IntelliJ IDEA .
public class HelloWorld { public static void main(String args) {
// prints "Hello, World!"
System.out.println("Hello, World!");
Oracle , компания, владеющая Java , публикует качественные уроки. Официальная документация освещает все функции Java и регулярно обновляется.
Примечание: единственный минус - официальная документация Java не всегда написана самым простым языком.
Если вы действительно хотите научиться программированию на Java , купите хорошую книгу. Конечно, 1000 страниц не прочитать за один день. Но хороший учебник поможет вам научиться программированию.
Java: Полное руководство (10-е издание)
Отличная книга для тех, кто только начинает изучать Java . Последнее издание включает все функции релиза Java 8 .
В книге описано всё, что нужно знать о программировании на Java , включая синтаксис, ключевые слова и фундаментальные основы программирования, а также библиотеку API Java , апплеты Java и многое другое.
Философия Java (4-е издание)
Если вы переходите на Java с другого языка программирования, эта книга для вас. Если же вы начинаете с нуля, лучше всего читать её вместе с другой.
Java 8. Карманный справочник: Скорая помощь Java-программистам
Эта книга содержит понятные ответы на вопросы, возникающие при обучении J ava программированию с нуля . Она кратко рассказывает обо всех основных концепциях Java (включая Java 9 ). Не хотите листать сотни страниц в поисках нужной строчки? Купите эту книгу.
Если начнёте изучать Java , не ошибётесь - это перспективный язык программирования, полный самых разнообразных возможностей.
Перед тем, как приступить к изучению Java , воспользуйтесь несколькими советами:
Надеемся, эта статья подтолкнёт вас к изучению Java и поможет начать работу над первыми программами.
Перевод статьи “Learn Java Programming. The Definitive Guide ” был подготовлен дружной командой проекта
Мы поговорим о базовом синтаксисе Java для начинающих. Синтаксис языка программирования - это набор правил, которые определяют, как пишется и интерпретируется…
В разделе Java на сайте developerWorks содержатся сотни статей, руководств, советов и материалов, написанных представителями сообщества Java, которые помогут вам максимально эффективно использовать платформу Java и сопутствующие технологии при разработке приложений. Однако начинающим разработчикам, которые только приступают к изучению Java, может быть трудно сориентироваться в огромном объеме ресурсов, доступных в Интернете. Поэтому мы создали эту страницу, на которой представлен обзор базовых Java-технологий в общем контексте возможностей этого языка. Здесь вы найдете ссылки на материалы для дальнейшего изучения Java, например, статьи developerWorks для начинающих и другие образовательные ресурсы, а также ссылки для загрузки продуктов IBM.
Вы - начинающий Java-разработчик? На этой странице вы найдете обзор основных Java™-технологий и их места в разработке современного программного обеспечения. Эта страница, содержащая ссылки на вводные статьи developerWorks по этой и смежным темам, другие образовательные материалы, а также на материалы для загрузки и продукты IBM, является превосходной отправной точкой для изучения Java.
Java - это одновременно язык программирования и платформа.
Во-первых, Java представляет собой высокоуровневый объектно-ориентированный язык программирования . При компиляции , которая выполняется один раз во время сборки приложения, код на Java преобразуется в код на промежуточном языке (байт-код ). В свою очередь, байт-код анализируется и выполняется (интерпретируется ) виртуальной машиной Java (JVM), которая играет роль транслятора между языком Java и аппаратным обеспечением с операционной системой. Все реализации Java должны эмулировать JVM, чтобы создаваемые приложения могли выполняться на любой системе, включающей виртуальную машину Java.
Во-вторых, Java - это программная платформа , версии которой поставляются для различных аппаратных систем. Существуют три версии Java (см. раздел Редакции платформы Java ниже). Платформа включает в себя JVM и интерфейс прикладного программирования на Java (API), представляющий собой обширный набор готовых программных компонентов (классов), облегчающих разработку и развертывание апплетов и приложений. API Java охватывает многие аспекты разработки на Java, в том числе манипулирование базовыми объектами, сетевое программирование, обеспечение безопасности, генерацию XML и Web-сервисы. API организован в виде набора библиотек, именуемых пакетами , которые содержат классы и интерфейсы для решения связанных друг с другом задач.
В дополнение к API каждая полноценная реализация платформы Java должна включать следующее:
JVM также является проверенной средой для выполнения приложений, написанных на отличных от Java языках. В частности, Groovy, Scala и специализированные реализации Ruby и Python предоставляют разработчикам возможность исполнения на JVM динамических и функциональных языков (более подробная информация приведена в разделе Какое отношение имеет Java к динамическим языкам и функциональному программированию?).
Язык Java был разработан компанией Sun Microsystems. В настоящее время развитие Java-технологий, в том числе работа над спецификациями, эталонными реализациями и тестами совместимости, осуществляется под контролем открытой некоммерческой организации JCP (Java Community Process), которая объединяет Java-разработчиков и держателей лицензий. В 2007 г. Sun выпустила свободную версию Java, включающую основные компоненты платформы, под лицензией GNU GPL v2 (GPLv2). Подробнее об этой версии можно прочитать в разделе Java и разработка свободного программного обеспечения.
Основное преимущество языка Java выражается в переносимости Java-приложений, т.е. способности работать на любых аппаратных платформах и операционных системах, поскольку все JVM, независимо от того, на какой платформе они работают, способны исполнять один и тот же байт-код.
Язык и платформа Java обладают великолепной масштабируемостью. Вы можете легко создавать приложения для устройств с ограниченными ресурсами, адаптируя программное обеспечение, изначально написанное для настольных компьютеров. При этом язык Java идеально подходит и для разработки серверных Web-приложений, при помощи которых пользователь может получать доступ к вычислительным ресурсам в Web. Возможность безопасного выполнения кода, загруженного через сеть, была изначально заложена в конструкцию Java, поэтому этот язык обеспечивает высокий уровень безопасности при работе через Интернет. Web-приложения работают в средах выполнения, называемых Web-контейнерами , которые предоставляют множество удобных сервисов, в том числе диспетчеризацию запросов, обеспечение безопасности и параллельной работы, управление жизненным циклом, а также доступ к таким API, как управление именами, транзакциями и электронная почта. На Java написан ряд серверов приложений , выполняющих функции Web-контейнеров для других компонентов Java, XML и Web-сервисов, которые взаимодействуют с базами данных и динамически формируют содержимое Web-страниц. Подобные серверы также предоставляют среду для развертывания корпоративных приложений и средства для управления транзакциями, кластеризации, обеспечения безопасности, связности и необходимого уровня доступности, производительности и масштабируемости.
Поддерживая применение открытых стандартов в корпоративных приложениях, Java открывает широкие возможности для применения Web-сервисов на основе XML, помогающих бизнес-партнерам обмениваться информационными ресурсами и приложениями. Java лежит в основе многих продуктов и услуг технического консалтинга IBM Продукты и технологии IBM для Java-разработчиков), а также играет ключевую роль для ряда важнейших направлений деятельности компании.
Редакции платформы Java
Существуют три редакции
платформы Java, позволяющие разработчикам приложений, поставщикам услуг
и производителям аппаратного обеспечения создавать решения, отвечающих
требованиям конкретных групп пользователей.
В разделе Java на сайте developerWorks содержится , входящих в состав Java. Ниже перечислены некоторые из компонентов, возможных дополнительных пакетов и расширений, входящих в состав каждой редакции платформы. Для каждой технологии приведено краткое описание, а также ссылка на материалы, в которых описывается ее место в мире Java. Обратите внимание, что многие из компонентов входят в состав всех трех редакций платформы Java.
Технологии, входящие в состав Java SE:
Технологии, входящие в состав J2EE:
Технологии, входящие в состав J2ME:
На протяжении многих лет Java является основным языком разработки Web-приложений. В последнее время появилось множество инфраструктур и библиотек, облегчающих создание Web-приложений на Java, в том числе многофункциональных интерактивных приложений Web 2.0.
Ознакомьтесь с приведенными ниже материалами, посвященным вопросам Web-разработки на Java.
Сервис-ориентированная архитектура (SOA) – это компонентная модель, связывающая функциональные модули приложения (известные как сервисы , откуда произошел термин Web-сервисы ) через строго описанные интерфейсы и контракты. Определения интерфейсов не зависят от используемого аппаратного обеспечения, операционной системы и языка программирования, на котором реализован сервис, благодаря чему поддерживается унифицированное взаимодействие между сервисами, являющимися компонентами разных систем. SOA – это пример слабо связанной программной модели, представляющей собой альтернативу классическим сильно связанным объектно-ориентированным моделям.
Созданные по такому принципу Web-сервисы позволяют описывать бизнес-правила и процессы на XML, благодаря чему взаимодействие приложений может осуществляться независимо от используемых платформ и языков программирования. XML-технологии способствуют переносимости данных и упрощают создание сообщений, в то время как технологии Java позволяют писать переносимый код. XML и Java отлично сочетаются и потому представляют собой идеальную связку технологий для создания и развертывания Web-сервисов.
Более подробную информацию можно получить, прочитав следующие материалы:
Многие разработчики, начинающие осваивать Java, имеют богатый опыт работы с другими языками программирования. При этом даже самые маститые программисты признают, что Java не является идеальным языком для решения всех встречающихся на практике задач. К счастью, благодаря поддержке со стороны JVM при разработке приложений для платформы Java можно пользоваться всеми преимуществами современных динамических скриптовых и функциональных языков. Гибкость и динамизм этих языков оказываются очень полезными при создании прототипов и реализации определенных типов приложений.
Подробнее о возможностях применения динамических и функциональных языков на платформе Java можно прочитать в материалах, ссылки на которые приведены ниже.
Существует бесчисленное множество по созданию библиотек, инструментариев, инфраструктур, программ и серверов приложений на Java, которые открывают для разработчиков дополнительные возможности по использованию этой мощной платформы. Ряд свободных технологий со временем был включен в состав платформы Java, а другие на протяжении многих лет остаются популярными среди Java-разработчиков, в некоторых случаях играя роль фактических стандартов.
Есть два основных пути развития ваших навыков программирования на Java: пройти специальный курс обучения (с возможностью сертификации) или изучать Java самостоятельно, практикуясь в написании кода. Обучающие курсы не только позволяют вам перенять опыт квалифицированных разработчиков, но и дают возможность получения сертификата, который может убедить потенциального работодателя, что вы обладаете навыками, необходимыми для решения стоящих перед нам технических задач. При этом вы сможете углубить свои знания в различных областях Java, экспериментируя самостоятельно и используя все доступные ресурсы. Какой бы путь вы ни выбрали, вам помогут следующие материалы.
IBM занимает одним из лидеров в практическом применении Java-технологий. Ниже приведены ссылки на некоторые продукты и технологии IBM, предлагаемые разработчикам приложений для платформы Java.
Что такое информационная безопасность? Это состояние защищенности информации, при котором обеспечиваются её конфиденциальность, доступность и целостность.
Обычно для того, чтобы оценить состояние защищенности информации, необходимо понять и провести анализ угроз и их источников, оценить уровень ущерба, вероятность реализации и актуальность угроз, риски (опционально), которые могут воздействовать на нашу систему/информацию.
На мой взгляд, невозможно оценить безопасность отдельно взятой технологии или языка программирования без привязки к конкретному способу реализации, т. е. без конкретного готового программного продукта на языке, у которого есть детальное ТЗ с описанием архитектуры и функционала. Но и этого тоже будет мало, так как необходимо оценивать состояние защищенности готовой информационной системы со своей специфичной архитектурой, набором компонентов, бизнес-процессами, информацией и, наконец, людьми. Приведу пример с постройкой дома. У нас есть материалы (песок, цемент, щебень, кирпич и т. д.) и инструменты (ведро, лопата, шпатель и т. п.). Оценить исключительно по используемым материалам/инструментам качество и надежность готового дома мы не сможем: сколько он простоит, будут ли в нем трещины, будет ли в нем холодно или тихо. Нужно выбрать проект дома, технологии строительства и бригаду мастеров. И только после завершения строительства мы сможем провести измерения соответствия проекту, ГОСТу, СНиПам, проверить измерения по теплозащите, шуму, нагрузкам, провести анализ качества цемента и ответить на большинство вопросов. Но на главный вопрос «сколько он простоит?» у нас не будет точного ответа, так как мы не знаем всех условий эксплуатации дома и всех факторов, которые будут воздействовать на протяжении всего времени.
Возьмем к примеру Java. Это объектно-ориентированный язык программирования; программы, написанные на Java, транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) - программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор. Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина.
« Универсальный язык» звучит красиво, но самая распространённая проблема - это одновременно и обратная сторона медали - утечка памяти в JVM, что приводит к переполнению памяти и сбоям. В связи с этой проблемой не исключены уязвимости, ведь основной постулат надежности - чем проще, тем лучше. В данном же случае собирается такой сложный пирог из обеспечения совместимости большого количества платформ и ОС, что практически невозможно отслеживать и закрывать все найденные в них уязвимости и оперативно их устранять. У той же Microsoft уязвимости могут быть найдены и исправлены спустя 4-8 лет, и это если не брать в расчёт оставленные намеренно или по ошибке недекларированные возможности.
Из моей практики: когда программисты добавляют новый функционал, который связан с уже реализованным, или исправляют старый функционал, то в 15% случаях они ломают ранее работающий продукт. И если при этом не проводят полное тестирование - на выходе имеем продукт с новым функционалом, но с частично не работающим старым. Также существуют различия написания кода для разных платформ, версий ОС, ПО. В связи с этим можно себе представить, насколько тяжело поддерживать язык программирования Javа и JVM, не говоря уже про вопросы безопасности.
На текущий момент выпущен Java Development Kit 10, который предлагает нам штатные механизмы обеспечения безопасности, выпущенные еще для Java SE 8 и описанные в Security Documentation. В десятой версии не добавилось ничего нового.
Отмечу, что у Oracle существует ресурсный центр безопасности Java . В целом компания разделяет безопасность Java на четыре основных раздела:
А) разработчики должны:
Следить и использовать все последние обновления среды разработки и безопасности;
Использовать программы контроля корректности кода (например, Checker Framework);
Б) системные администраторы должны:
Следить и использовать все последние обновления для Java и необходимые компоненты для работы продукта (в т. ч. ОС, библиотеки, фреймворки, и т. д.);
Использовать правила развертывания Java, описанные и ;
Использовать надёжную метку времени.
В) конечные пользователи должны:
Всегда использовать последнюю оригинальную версию Java;
Г) профессионалам в области безопасности необходимо:
Использовать расширенные инструменты управления и повышения безопасности (например, Advanced Management Console);
Контролировать своевременную установку всех обновлений безопасности;
Важно, чтобы все следовали и выполняли правила и требования безопасности. Достичь состояния безопасности на адекватном уровне можно только сообща и применяя все доступные меры (технические, организационные). Как показывает моя практика, в 60% организаций у ИТ- и ИБ-служб все нормально с безопасностью, а также с пользователями, которые используют корпоративные устройства и подключены к единому домену. А вот самыми неконтролируемыми в этой области являются разработчики, тимлиды, архитекторы.
Если взять шире, то основные причины возникновения проблем безопасности в приложениях при разработке ПО следующие:
А) Отсутствие понимания терминологии безопасности в целом, не говоря о специфических знаниях и применяемых решениях.
Как правило, у разработчиков безопасность в лучшем случае ассоциируется со следующими вещами: управление и журналирование доступа и парольная защита, реже - защита соединения на уровне https (использование механизмов шифрования, которые доступны из коробки по умолчанию). Т. е. формально они будут использовать методы обеспечения безопасности, которые по факту останутся формальными, «для галочки», без учета требований и нюансов:
Для паролей: обычно используются значения по умолчанию и не настраиваются дополнительно длина, стойкость, частота смены, неповторяемость, количество попыток. Довольно часто эти параметры нельзя донастроить, так как они не были включены в скоуп-задачу по разработке ПО, что приводит к необходимости дописывать код.
По управлению и журналированию доступа: в лучшем случае разработчикам описали группы или роли пользователей и объекты доступа, которые должны быть доступны в ПО. В худшем - разработчики сами «поделили» разделы и объекты на необходимые пользователям и администраторам. В первом случае получаем систему, которую можно гибко настроить, но требуется потратить значительное количество времени на настройку и согласование прав. Во втором - формальную систему разграничения доступа. Кроме того, разработчикам надо понимать, какую именно информацию и в каком объёме необходимо журналировать. Однако зачастую им эту информацию не предоставляют, что приводит к недостаточной детализации журналов для разбора инцидентов или понимания того, что происходит в ПО. Или же к избыточному хранению логов и большого объёма информации, что накладывает существенные ограничения на возможность хранения информации в течение необходимого периода времени (например, один-три года) или возникает необходимость закупки дополнительных хранилищ информации. При избыточной записи информации возникают дополнительные проблемы со скоростью анализа и разбора инцидентов и быстротой поиска нужной информации. Избыточность также может потребовать дополнительного финансирования на расширение штата, закупку SIEM-систем с настройкой уникальных правил обработки информации или вести к рискам, связанным с неактуальностью информации. При этом тратится слишком много времени на анализ и обработку информации.
Защита каналов связи - не менее существенный момент, особенно для платежных и банковских систем, где помимо разглашения персональных и личных данных возможны финансовые потери. Чаще всего бывает, что о защите каналов и среды передачи информации не думают, а если и думают, то используют настройки «по умолчанию», например, TLS/SSL. Но там ведь тоже есть свои особенности по выбору версии протокола (TLS 1.1, 1.2, 1.3 или SSL v1-3), алгоритма шифрования (RC4, IDEA, Triple DES, SEED, Camellia или AES), длины ключа. Иногда выбирается, например, правильный протокол TLS 1.2, с шифрованием по AES, длиной ключа 256 бит, но забывается про возможность выбора адреса по порту 443 для HTTPS и или 80-й порт для HTTP, вместо блокировки 80-го порта, в результате чего появляется возможность получать доступ по незащищенному каналу. Или, например, поднимают инфраструктуру на виртуальных машинах и совсем не думают о необходимости закрыть сетевой доступ между виртуальными машинами.
Б) Вторая проблема связана с бизнесом, так как он вкладывает деньги в конкретный специальный функционал, который не учитывает блоки безопасности.
К сожалению, бизнес не всегда понимает, зачем ему тратить ресурсы на блоки безопасности, если от них нет функциональной пользы, денег больше продукт не принесёт, а есть только вероятные риски, которые могут и не сработать. Бизнес чаще понимает необходимость вкладываться в безопасность, когда инцидент ИБ уже произошел.
К сожалению, в этом виноват не только бизнес, но и его окружение, которое:
Также не понимает в безопасности;
Пожалело бюджет на специалистов по ИБ (не нанимаются вообще или нанимаются узкоспециализированные специалисты, или нанимается один человек, отвечающий за все);
Не смогло аргументировано донести необходимость в безопасности и правильно обосновать текущие риски (репутационные, финансовые, временны́е).
В) Проблема с коммуникацией в компании или отсутствие оной.
Это тот случай, когда бизнес и его окружение понимают необходимость и важность ИБ. Они выделили бюджеты, наняли соответствующих специалистов, но возникают сложности в коммуникации между бизнес-подразделениями и службами ИБ/ИТ, разработчиками.
Г) Недостаточная осведомленность простых пользователей компании в вопросах ИБ.
Предположим, что есть все необходимые подразделения, специалисты, технические и организационные меры. Но пользователи упираются и не хотят работать по правилам. Очень частая ситуация, и решать ее также необходимо комплексно, так как люди не понимают, зачем им лишняя работа по соблюдению вопросов ИБ (проверять файлы антивирусом, запоминать сложные пароли, знать и соблюдать политики и бизнес-процессы и т. д.). Нужно периодически устраивать мастер-классы, рассказывать на бытовом уровне, что такое ИБ, какие есть проблемы и решения, доводить глобальные цели и задачи ИБ, их и влияние на бизнес, мотивировать.
Д) Нехватка архитекторов ИБ - не всегда в разработке ПО участвуют специалисты по ИБ, и программисты сами думают о безопасности архитектуры и применении написанных и готовых шаблонов безопасности (Security patterns).
Всех нюансов разработчики не знают и не могут знать, так как их задача - выполнить разработку и перейти к следующей. Если углубиться в саму разработку, то процесс намного сложнее, чем кажется. Поэтому необходимо четко получить задачу от бизнеса, декомпозировать ее на понятные мини-задачи для разработчиков, провести разработку, провести альфа- и бета-тестирования, нагрузочные, функциональные тестирования, исправить ошибки, вернуться к тестам - этот процесс цикличный и долгий. Поэтому неудивительно, что у них не хватает ресурсов продумать до мелочей безопасность продукта.
Чтобы можно было говорить о безопасности, нужно решить описанные выше проблемы. Я специально не описываю варианты решений, так как все зависит от конкретных проблем, среды, условий. Универсальной пилюли не существует и необходимо использовать все возможные меры. Основная задача состоит в том, чтобы все работники компании вникали, понимали и выполняли требования ИБ и были заинтересованы в их соблюдении. И только тогда можно будет говорить об эффективности и хорошем уровне зрелости ИБ в компании.