Безопасность и виртуальная Java-машина. Как научиться программировать на Java — полное руководство

Итак, 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 -платформа обладает следующими преимуществами:

  • переносимость, или кроссплатформенность ;
  • объектная ориентированность, создана эффективная объектная модель;
  • привычный синтаксис С/С++;
  • встроенная и прозрачная модель безопасности ;
  • ориентация на Internet-задачи, сетевые распределенные приложения;
  • динамичность , легкость развития и добавления новых возможностей;
  • простота освоения.

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

Основные версии и продукты Java

Сразу оговоримся, что под продуктами здесь понимаются программные решения от компании Sun, являющиеся "образцами реализации" ( reference implementation ).

Итак, впервые Java была объявлена 23 мая 1995 года. Основными продуктами, доступными на тот момент в виде бета-версий, были:

  • Java language specification , JLS , спецификация языка Java (описывающая лексику, типы данных, основные конструкции и т.д.);
  • спецификация JVM ;
  • Java Development Kit , JDK - средство разработчика, состоящее в основном из утилит, стандартных библиотек классов и демонстрационных примеров.

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

Спецификация JVM предназначена в первую очередь для создателей виртуальных машин, а потому практически не используется Java -программистами.

JDK долгое время было базовым средством разработки приложений. Оно не содержит никаких текстовых редакторов, а оперирует только уже существующими Java -файлами. Компилятор представлен утилитой javac (java compiler). Виртуальная машина реализована программой java . Для тестовых запусков апплетов существует специальная утилита appletviewer . Наконец, для автоматической генерации документации на основе исходного кода прилагается средство javadoc .

Первая версия содержала всего 8 стандартных библиотек:

  • java.lang - базовые классы, необходимые для работы любого приложения (название - сокращение от language);
  • java.util - многие полезные вспомогательные классы;
  • java.applet - классы для создания апплетов ;
  • java.awt , java.awt.peer - библиотека для создания графического интерфейса пользователя (GUI ), называется Abstract Window Toolkit , AWT , подробно описывается в лекции 11;
  • java.awt.image - дополнительные классы для работы с изображениями;
  • java.io - работа с потоками данных (streams) и с файлами;
  • java.net - работа с сетью.

Таким образом, все библиотеки начинаются с 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. Это объектно-ориентированный язык программирования; программы, написанные на 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).

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

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

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

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

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

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

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

1. Предугадать любые потенциально опасные действия и методы вторжения.

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

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

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

5. Реализовать язык и разрешить исполняемым программам пользоваться только этим утвержденным безопасным языком.

Сценарии внешней атаки можно разбить на следующие группы (список не полный):

· Повреждение или нарушение целостности данных и/или состояния выполняемой программы;

· Сбор или копирование конфиденциальной информации;

· Блокирование ресурсов, вследствие которого они становятся недоступными для законных пользователей и программ;

· Захват ресурсов и их использование внешней неавторизованной программой;

· Создание нефатальных ситуаций, снижающих производительность, особенно в устройствах вывода;

· Присвоение прав доступа и использование их или компьютера клиента для вторжения в другие элементы сети.

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

Таблица1.1 Потенциально уязвимые объекты и типы воздействие

Нарушение целостности

Перехват информации

Блокировка/ Изменение прав

Захват ресурса

Нефатальные помехи

Захват полномочий

Файловая система

Нарушение целостности

Перехват информации

Блокировка/ Изменение прав

Захват ресурса

Нефатальные помехи

Захват полномочий

Конфиденциальная информация

Центральный

процессор

Устройства вывода

Устройства ввода

ОС, состояние программ

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

Говоря конкретно, схема защиты языка Java рассматривает следующие уязвимые объекты:

· Память;

· ОС/состояние программ;

· Файловая система клиента;

· При этом учитываются следующие типы вмешательств, перечисленные в табл. 1.1;

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

· Блокировка/изменение прав пользования ресурсами клиентской машины. Обычно вызывается вирусами;

· Перехват информации в клиентской машине. К примеру, легко выполняется при помощи команды UNIX SENDMAIL;

· Захват полномочий клиентской машины. Достигается подменой IP- адресов. Этот тип компьютерной атаки был придуман Кевином Митни- ком (Kevin Mitnick), когда тот "взломал" один из личных компьютеров эксперта по системам защиты Сутумо Шимура (Tsutumo Shimura). Весь этот инцидент подробно описан в бестселлере "Разборки", написанной для "New York Times" Сутумо Шимурой.

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

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

· Инкапсуляция и сокрытие данных в private-объявлениях;

· Управляемый доступ к структурам данных, при котором; используются только public-методы;

· Наращиваемость и иерархическое построение сложной структуры программы;

· Отсутствие перегрузки операций.

Классы и методы можно объявлять как final, запрещая тем самым создание подклассов и переопределение методов. Такое объявление препятствует злонамеренному изменению проверенного кода.

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

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

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

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

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

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

· Проверка переполнения стека и потери значимости указателя стека;

· Анализ доступа к регистрам;

· Проверка правильности параметров байт-кодов;

· Анализ потоков байт-кодов, создаваемых методами, что обеспечивает целостность стека проверка получаемых объектов и объектов, возвращаемых методами.

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

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

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

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

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

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

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

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

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

· Защита от инсталляции дополнительного загрузчиков классов ClassLoader;

· Возможность компоновки динамических библиотек (используется для машинно-зависимого кода);

· Чтение из файла классов а Запись в файл классов;

· Создание сетевого соединения;

· Возможность соединения с некоторым сетевым портом;

· Разрешение входящего сетевого соединения;

· Доступность некоторого пакета;

· Добавление в пакет нового класса.

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

На апплеты, загружаемые по сети, накладываются следующие ограничения:

· Нельзя создавать, переименовывать или копировать файлы и каталоги локальной файловой системы;

· Нельзя создавать произвольные сетевые соединения, за исключением связей с той хост-машиной, с которой апплеты были считаны. Имя хост- машины должно быть указано в URL-адресе той HTML-страницы, которая содержала тег , или задаваться в параметре codebase тега . Числовой IP-адрес хост-машины не допускается.

Перечисленные строгие ограничения на доступ к локальной файловой системе касаются апплетов, работающих в среде браузера Netscape Navigator 3.0. В программе Appletviewer из пакета JDK 1.0 ограничения менее строгие, и пользователь может определять явно список файлов, с которыми могут работать апплеты.

Апплеты могут считывать некоторые свойства системы при помощи вызова system.getProperty (string key). Апплеты в Netscape 3.0 имеют неограниченный доступ к этим свойствам. В программе JDK 1.0 Appletviewer от Sun можно индивидуально контролировать доступ к каждому свойству. В табл. 1.2 перечислена информация, возвращаемая для различных значений ключа key.

java интерфейс приложение программа

Таблица 1.2 Доступность системных переменных

В табл. 1.3 перечислены параметры, недоступные для апплетов в среде браузера Netscape 3.0. Программа JDK 1.0 Appletviewer и браузер HotJava позволяют пользователю управлять доступом к некоторым из указанных ресурсов.

Таблица 1.3 Системные переменные, недоступные для апплетов

Java-система загружает апплеты двумя способами. Апплет может быть передан по сети или же загружен из локальной файловой системы. Способ загрузки апплета определяет предоставляемые ему возможности.

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

· Загружать в клиентской машине библиотеки;

· Выполнять в локальной машине внешние процессы;

· Останавливать работу виртуальной Java-машины.

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

Вы - начинающий Java-разработчик? На этой странице вы найдете обзор основных Java™-технологий и их места в разработке современного программного обеспечения. Эта страница, содержащая ссылки на вводные статьи developerWorks по этой и смежным темам, другие образовательные материалы, а также на материалы для загрузки и продукты IBM, является превосходной отправной точкой для изучения Java.

Что такое "технологии 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 выражается в переносимости Java-приложений, т.е. способности работать на любых аппаратных платформах и операционных системах, поскольку все JVM, независимо от того, на какой платформе они работают, способны исполнять один и тот же байт-код.

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

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

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

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

  • Java SE (Java Platform, Standard Edition) . Используя Java SE, вы можете создавать и развертывать Java-приложения для настольных компьютеров и серверов, а также разрабатывать встроенное программное обеспечение и программы для систем реального времени. Редакция Java SE включает классы, необходимые для создания Web-сервисов, и базовые компоненты Java EE (Java Platform, Enterprise Edition). Текущей версией платформы Java SE является Java SE 6, также известная как "Мустанг". При этом многие разработчики по-прежнему используют Java SE 5 (Java 5.0, или "Тигр").
    • Прекрасный обзор возможностей Java SE 5 приведен в статьях колонки . Большая часть аспектов программирования для платформы Java SE 5, для которой были созданы многие существующие приложения, по-прежнему актуальны и для Java SE 6.
    • В статье описываются новые возможности Java SE 6, служащие для мониторинга и оценки производительности приложений.
    • В статье приводится введение в скриптовый язык, работающий поверх платформы Java SE 6 и служащий для упрощения программирования сложных пользовательских интерфейсов.
    • В серии из двух статей под названием содержится введение в API, предоставляемый Java SE 6, который позволяет Java-приложениям выполнять динамический скриптовый код и наоборот. .
  • Java EE (Java Platform, Enterprise Edition) . Эта корпоративная версия платформы помогает разработчикам создавать и развертывать переносимые, надежные, масштабируемые и безопасные серверные приложения на Java. Развивая возможности Java SE, Java EE предоставляет API Web-сервисов, компонентных моделей, удаленного взаимодействия и управления для реализации корпоративного программного обеспечения по принципам SOA и Web 2.0.
    • Прочитайте статьи и , в которых содержится вводный обзор возможностей последней версии платформы Java EE.
    • Обратите внимание на серию - популярной инфраструктуре для создания легковесных и надежных приложений Java EE.
    • Дополнительная информация о Java EE приводится в статьях колонки .
    • Статьи серии Начало пути: Миграция на платформу Java (EN) были написаны специально для разработчиков.NET, клиент-серверных приложений для Windows и приложений ASP, чтобы помочь им перейти на Java.
  • Java ME (Java Platform, Micro Edition) . Java ME предоставляет среду для выполнения приложений, созданных для широкого круга мобильных и встроенных систем, например мобильных телефонов, карманных компьютеров, телевизионных приставок и принтеров. Эта редакция платформы предоставляет средства создания гибких пользовательских интерфейсов, надежную модель обеспечения безопасности, полный спектр встроенных сетевых протоколов, а также мощную поддержку сетевых и оффлайновых динамически загружаемых приложений. Приложения, базирующиеся на спецификациях Java ME, могут быть запущены на множестве устройств и при этом способны эффективно задействовать их системные возможности.

Какие технологии являются основными компонентами платформы Java?

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

Технологии, входящие в состав Java SE:

  • Java Foundation Classes (Swing) (JFC) - это набор библиотек Java-классов, служащих для создания графических интерфейсов пользователя и реализации других графических функций в клиентских Java-приложениях. Руководство .
  • JavaHelp - это независимая от платформы расширяемая справочная система, позволяющая разработчикам и техническим писателям встраивать справочные страницы в апплеты, программные компоненты, приложения, операционные системы и устройства, а также создавать справочные Web-системы. Обратитесь к статье .
  • Благодаря Java Native Interface (JNI) Java-приложения, выполняющиеся внутри JVM, могут взаимодействовать с программами и библиотеками, написанными на других языках программирования.
  • Технология Java Web Start упрощает развертывание Java-приложений, позволяя пользователям загружать и запускать функционально насыщенные программные средства, например, электронные таблицы, одним нажатием на кнопку мыши, без инсталляции (см. статью ).
  • Java Database Connectivity (JDBC) - это API, предоставляющий средства для доступа к большинству реляционных источников данных из Java-приложений. С его помощью можно подключаться к множеству баз данных SQL, а также другим табличным источникам данных, например, электронным таблицам и неструктурированным файлам.
  • Java Advanced Imaging (JAI) - это объектно-ориентированный API, предоставляющий простую высокоуровневую модель программирования, упрощающую манипулирование изображениями.
  • Java Authentication and Authorization Service (JAAS) - это технология, предоставляющая сервисам средства для аутентификации пользователей и проверки их прав доступа. Она включает Java-реализацию стандартной инфраструктуры PAM (Pluggable Authentication Module) и поддерживает авторизацию на уровне пользователей.
  • Java Cryptography Extension (JCE) - это набор пакетов, предоставляющих инфраструктуру и реализации алгоритмов шифрования, генерации и обмена ключами и установления подлинности сообщений (Message Authentication Code - MAC). Эта технология также включает поддержку симметричных, асимметричных, блочных и поточных шифров, а также безопасных потоков и опечатанных объектов (sealed objects). Более подробную информацию можно получить в руководстве .
  • Java Data Objects (JDO) - это стандартная абстрактная модель долговременного хранения Java-объектов, базирующаяся на интерфейсах. С ее помощью разработчики могут напрямую сохранять экземпляры Java-классов предметной области в постоянном хранилище (например, базе данных). Эта модель в ряде случаев может заменять прямую запись в файл, сериализацию, JDBC, а также использование серверных компонентов EJB, как управляемых контейнерами (Container Managed Persistence - CMP), так и самостоятельно хранящих состояние (Bean Managed Persistence - BMP).
  • Пакет Java Management Extensions (JMX) содержит средства для создания распределенных, модульных, динамических и доступных через Web приложений для управления и мониторинга устройств, программного обеспечения и сетей, основанных на предоставлении сервисов (см. статью ).
  • Java Media Framework (JMF) позволяет добавлять аудио-, видео- и другую медиа-информацию в приложения и апплеты на Java (см. руководство ).
  • Java Naming and Directory Interface (JNDI) - это унифицированный интерфейс для обращения к различным сервисам имен и каталогов в корпоративной сети. С его помощью приложения могут эффективно подключаться к различным службам имен и каталогов в гетерогенной среде уровня предприятия.
  • Java Secure Socket Extensions (JSSE) - это набор пакетов для обеспечения безопасного обмена информацией в Интернете. Они реализуют Java-версию протоколов SSL (Secure Sockets Layer) и TLS (Transport Layer Security) и предоставляют средства для шифрования данных, проверки целостности сообщений, аутентификации на сервере и на клиенте (последняя возможность не является обязательной).
  • Java Speech API (JSAPI) включает в себя спецификации JSGF (формат грамматики Java Speech) и JSML (язык разметки Java Speech). Этот пакет предоставляет возможности для использования речевых технологий в пользовательском интерфейсе. JSAPI - это кросс-платформенный API для поддержки распознавания голосовых команд, систем речевого ввода данных и синтеза речи. За более подробной информацией обратитесь к следующему разделу статьи .
  • Java 3D - это API, предоставляющий кросс-платформенные и масштабируемые возможности для работы с 3D-графикой в Java-приложениях. API организован в виде набора объектно-ориентированных интерфейсов, складывающихся в единую простую высокоуровневую модель программирования.
  • Механизм Metadata Facility позволяет разработчикам определять атрибуты для классов, интерфейсов, полей и методов, благодаря чему они могут подвергаться специальной обработке со стороны средств разработки, развертывания и сторонних библиотек на этапе выполнения приложения (см. статью ).
  • Java Content Repository API - это API для доступа к репозиториям контента в Java SE независимо от их реализации. Подобные репозитории представляют собой высокоуровневые системы управления информацией и являются расширенными вариантами классических репозиториев данных.
  • Enumerations (перечисление) - это тип данных, позволяющий описывать различные элементы данных в виде типизированного набора констант.
  • Generics (обобщенные типы) позволяют создавать классы с параметрами (абстрактными типами), которые указываются на этапе инстанциирования. За подробностями обратитесь к статье , а также ознакомьтесь со статьей , в которой рассказывается о том, как обобщенные типы облегчают работу с коллекциями в Java SE 6.0.
  • Утилиты Concurrency - это набор классов, предоставляющих функциональность среднего уровня, которая обычно требуется приложениям, выполняющим параллельную обработку данных.
  • Java API for XML Processing (JAXP) - это API, при помощи которого Java-приложения могут разбирать и преобразовывать XML-документы вне зависимости от используемого процессора XML. Это позволяет приложениям легко переключаться между разными процессорами без изменений в прикладном коде. В свою очередь, технология JAXB (Java API for XML Binding ) предоставляет возможности для автоматизации сопоставления документов XML и объектов Java.
  • SOAP with Attachments API for Java (SAAJ) предоставляет разработчикам функции для формирования и обработки сообщений в соответствии со спецификацией SOAP 1.1 c указанием SOAP with Attachments (SOAP с вложениями). За более подробной информацией обратитесь к статье ).

Технологии, входящие в состав J2EE:

  • Enterprise JavaBeans (EJB) - это компонентная модель, которая упрощает разработку связующего программного обеспечения, предоставляя такие сервисы, как управление транзакциями, обеспечение безопасности и подключение к базам данных.
  • Спецификация портлетов определяет набор API для создания порталов на Java, охватывая такие аспекты, как агрегирование и представление информации, персонализация и обеспечение безопасности (см. статью ).
  • JavaMail - это API, предоставляющий набор абстрактных классов, моделирующих почтовую систему.
  • Java Message Service (JMS) - это API, поддерживающий создание переносимых Java-приложений на основе механизма обмена сообщениями. Он определяет общий набор базовых понятий и стратегий программирования для всех систем обмена сообщениями, совместимых с JMS .
  • JavaServer Faces (JSF) предоставляет программную модель, помогающую создавать Web-приложения путем компоновки страниц из многократно используемых компонентов пользовательского интерфейса, а также связывания этих компонентов с источниками данных, а событий, генерируемых на клиенте - с серверными обработчиками. За более подробной информацией обратитесь к руководству из двух частей и серии статей колонки .
  • JavaServer Pages (JSP) предоставляет Web-разработчикам средства для быстрого создания и простой поддержки динамических, кросс-платформенных Web-страниц, которые разделяют пользовательский интерфейс и генерацию контента, благодаря чему дизайнеры могут изменять разметку, не трогая динамически формируемое содержимое (см. руководство .
  • Стандартная библиотека тегов для JavaServer Pages (JSTL) - это набор специализированных тегов, предоставляющих стандартный формат для выполнения действий, необходимых многим Web-приложениям. Ознакомьтесь со статьей Обновите ваши страницы JSP при помощи JSTL (EN) и серией из четырех частей под названием .
  • Сервлеты Java расширяют функциональность Web-серверов, предоставляя кросс-платформенный, компонентный подход к созданию Web-приложений, свободный от ограничений производительности, характерных для CGI.
  • J2EE Connector Architecture (JCA) предоставляет стандартную архитектуру для подключения приложений J2EE к разнородным корпоративным информационным системам (EIS). Эта архитектура определяет набор масштабируемых и безопасных механизмов на основе транзакций, при помощи которых поставщики EIS могут предоставлять стандартные адаптеры ресурсов для включения в сервер приложений. За более подробной информацией обратитесь к статьям , и руководству .
  • Спецификация J2EE Management (JMX) определяет информационную модель управления для платформы J2EE. Эта модель была специально спроектирована для взаимодействия со многими системами и протоколами управления. Она содержит стандартные средства для сопоставления с общей информационной моделью (Common Information Model - CIM), информационной базой управления SNMP (SNMP Management Information Base - MIB) и объектной моделью Java при помощи резидентного серверного компонента EJB (J2EE Management EJB Component - MEJB).
  • Java Transaction API (JTA) – это высокоуровневая реализация и независимый от протоколов API, предоставляющий программам и серверам приложений средства для доступа к транзакциям. Java Transaction Service (JTS) определяет реализацию менеджера транзакций, который поддерживает JTA и реализует на нижележащем уровне сопоставление с объектным транзакционным сервисом OMG (Object Transaction Service - OTS 1.1). Распространение транзакций в JTS реализуется при помощи протокола Inter-ORB (IIOP). За более подробной информацией обратитесь к статье .

Технологии, входящие в состав J2ME:

  • Mobile Information Device Profile (MIDP) - это одна из двух конфигураций, составляющих среду выполнения Java для мобильных устройств с ограниченными ресурсами. MIDP предоставляет приложениям базовую функциональность, включающую в себя средства для создания интерфейсов пользователя, подключения к сетевым ресурсам, локального хранения данных и управления жизненным циклом.
  • Connected Device Configuration (CDC) – это стандартизированная инфраструктура для создания и развертывания приложений, доступ к которым может осуществляться со стороны многих сетевых и встроенных устройств.
  • Mobile 3D Graphics API для J2ME (M3G) - это легковесный интерактивный API для реализации трехмерной графики, являющийся дополнительным компонентом J2ME. Подробнее о нем можно прочитать в серии из двух частей .

Технологии Java и создание Web-приложений

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

Ознакомьтесь с приведенными ниже материалами, посвященным вопросам Web-разработки на Java.

  • Статьи колонки рассказывают о Grails – современной инфраструктуре для создания Web-приложений, написанных на Groovy. Grails позволяет органично сочетать ранее написанный код на Java с возможностью использования гибкого и динамического скриптового языка. Более подробная информация о Groovy приведена ниже, в разделе Какое отношение имеет Java к динамическим языкам и функциональному программированию?.
  • Ajax – это методология программирования, предусматривающая использование скриптовых языков на стороне клиента для обмена данными с Web-сервером, что позволяет быстро обновлять информацию на страницах без необходимости их полной перезагрузки. Прочитав серии статей и , вы узнаете, чем Ajax может помочь вам как разработчику Java-приложений. За дополнительной информацией вы можете обратитесь к на сайте developerWorks.
  • JavaServer Faces (JSF) предоставляет программную модель, помогающую создавать Web-приложения путем компоновки страниц из многократно используемых компонентов пользовательского интерфейса, а также связывания этих компонентов с источниками данных, а событий, генерируемых на клиенте - с серверными обработчиками. За более подробной информацией обратитесь к руководству из двух частей и серии статей колонки .
  • Платформа Web-инструментария Eclipse (Web Tools Platform – WTP) расширяет популярную среду разработки Eclipse, добавляя в нее средства для создания Web-приложений на основе технологий Java EE (см. руководство ).
  • В на сайте developerWorks можно найти множество других превосходных материалов по этим вопросам.

Технологии Java, SOA и Web-сервисы

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

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

Более подробную информацию можно получить, прочитав следующие материалы:

  • Страницы и на сайте developerWorks помогут вам сориентироваться в этих непростых технологиях.
  • В статьях серии рассказывается об инфраструктурах Web-сервисов на Java, а также о новых функциональных слоях, созданных на базе этих сервисов.
  • В статье приводится введение в элегантный стиль проектирования Web-сервисов под названием Передача репрезентативного состояния (Representational State Transfer - REST) и рассказывается об использовании Java для создания Web-сервисов по принципам REST.
  • Понимание технологии JAX-RPC (RPC на основе API Java для работы с XML) имеет большое значение для создания эффективных Web-сервисов на Java.
  • JAX-WS – это очевидный следующий шаг в развитии JAX-RPC. Практическое введение в этот новый API дано в руководстве .
  • Серия статей представляет собой руководство по компонентной архитектуре сервисов (Service Component Architecture - SCA) - спецификации, описывающей модель разработки приложений и систем по принципам SOA.
  • В статье приводится введение в инфраструктуру Service Data Objects (объекты данных сервисов), которая упрощает модель работы с данными в Java EE при создании SOA-приложений.

Какое отношение имеет Java к динамическим языкам и функциональному программированию?

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

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

  • Скриптовый язык Groovy позволяет Java-разработчикам использовать наиболее привычные языковые конструкции и библиотеки, при этом предоставляя гибкую, динамическую среду разработки, которая не требует компиляции, упрощает синтаксис и поддерживает выполнение скриптов внутри обычных Java-приложений. Детальный обзор возможностей этого языка приводится в статьях серии .
  • Новый API скриптов в Java SE 6, обеспечивающий обратную совместимость с Java SE 5 и содержащий небольшой набор интерфейсов и классов, предоставляет простой способ вызова из Java-кода скриптов, написанных на десятках языков. С его помощью вы можете загружать и вызывать внешние скрипты на этапе выполнения, динамически изменяя поведение приложения. Подробнее об этом API можно прочитать в серии из двух статей под названием .
  • Вы - горячий сторонник функционального программирования? Тогда вам следует обратить внимание на колонку , в которой рассказывается о Scala - языке программирования для JVM, сочетающем функциональный и объектно-ориентированный подход к разработке.
  • VM поддерживают альтернативные языки программирования уже на протяжении длительного времени. В статьях колонки можно прочитать о реализациях для JVM таких языков, как Rexx, Ruby, JavaScript, Python и некоторых других.

Java и создание свободного программного обеспечения

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

  • Организация Apache Software Foundation(EN) объединяет множество открытых проектов, большинство из которых разрабатываются на основе технологий Java. Ниже перечислены некоторые представители этого семейства проектов.
    • Apache Struts(EN) - это инфраструктура для создания Web-приложений, архитектура которых следует принципу "Модель-Представление-Контроллер" (Model-View-Controller).
    • Apache Shale(EN) - еще одна современная инфраструктура для создания Web-приложений, являющаяся наследницей Struts и базирующаяся на технологии JSP (JavaServer Pages). Введение в Shale содержится в статьях серии .
    • Apache Ant является фактическим стандартом для автоматизации процесса сборки Java-приложений.
    • Средство сборки Apache Maven(EN) проектировалось с учетом требований современных проектов по созданию программного обеспечения, для которых характерны динамичное взаимодействие между группами разработчиков и зависимость от множества независимо поддерживаемых компонентов (см. руководство ).
    • Apache Tomcat - это популярный Web-контейнер, поддерживающий сервлеты и серверные страницы Java (JSP).
    • Проект Apache Geronimo(EN) заключается в создании полностью соответствующего спецификации сервера приложений Java EE на основе исключительно свободных технологий. Подробнее о Geronimo можно прочитать в статье , а также в на сайте developerWorks, содержащем множество полезных материалов.
    • Apache Derby(EN) - это сервер реляционных баз данных, полностью реализованный на Java. Введение в Derby приводится в статье .
  • Eclipse(EN) – это открытая и независимая платформа разработки, а также набор базовых инструментов для создания программного обеспечения. Она написана на Java и предоставляет инфраструктуру на основе подключаемых модулей, облегчающую разработку, интеграцию и использование программных средств. IBM является одним из учредителей Eclipse.org и активно участвует в совете управляющих этого проекта, а также его подкомитетах. О некоторых компонентных технологиях платформы Eclipse, направленных на создание Java-приложений, можно прочитать в следующих материалах:
    • AspectJ(EN) - это аспектно-ориентированное расширение языка Java, которое может использоваться для модульной реализации сквозной функциональности, например журналирования или обработки исключений.
    • Standard Widget Toolkit(EN) (SWT) - это инструментарий, позволяющий задействовать возможности операционной системы для создания элементов пользовательских интерфейсов эффективным и переносимым образом.
    • Mylyn(EN) - это мощная система управления заданиями для пользователей Eclipse. Подробное руководство содержится в статьях и, ранее известный как "система безопасности Acegi для Spring" - это мощное и гибкое решение для обеспечения безопасности в корпоративных приложениях, созданных на базе инфраструктуры Spring. Она подробно рассматривается в четырех статьях серии .
  • Компания Sun Microsystems также начала работу по , запустив следующие общественные проекты на сайте java.net(EN) :
    • OpenJDK

Как развивать навыки программирования на Java?

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

  • Руководства и статьи
    • На сайте developerWorks представлена обширная коллекция , которые по степени полезности в процессе изучения Java уступают только самостоятельному написанию кода.
    • Статьи серий и прекрасно подходят для совершенствования вашей техники владения Java.
    • Применение теории проектирования при создании реальных приложений рассматривается в статьях серии .
    • Опытные разработчики Java заранее закладывают в свои приложения средства для их отладки и тестирования. На сайте developerWorks представлены несколько статей серии - это игры реального времени на базе платформы Eclipse, направленные на изучение программирования на Java. Вводная информация о CodeRuler приводится в статье Завоевание средневековых королевств вместе с CodeRuler (EN).
  • Технические обучающие курсы IBM
    • Вашему вниманию предлагается большой выбор онлайновых, очных и мультимедийных курсов по Java, разработанных подразделением IBM Global Services.
  • Сертификация
    • Вы можете сдать несколько экзаменов для получения сертификатов, свидетельствующих о ваших навыках программирования на Java. Материалы, посвященные курсам с последующей сертификацией, находятся на сайте Java Certification(EN) .
    • IBM предоставляет возможность ваших навыков в таких технологиях, имеющих отношения к Java, как создание корпоративных приложений для WebSphere, программное обеспечение Rational, DB2, XML и SOA.
  • Форумы
    • , модерируемые экспертами, за плечами которых многолетний опыт работы с Java-технологиями - это наиболее интерактивный из способов изучения языка Java.

Продукты и технологии IBM для Java-разработчиков

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

  • Бесплатно загружаемые продукты:
    • (Java Developer Kit) - это набор средств для создания и тестирования апплетов и приложений для Java SE и Java ME на множестве популярных операционных систем, в том числе Windows, Linux и AIX.
    • (IBM Development Package for Eclipse) - это основанный на Eclipse неподдерживаемый инструментарий разработчика, позволяющий создавать и запускать приложения в собственной готовой среде разработки.
    • : Вы можете загрузить пакеты свободного программного обеспечения Eclipse c сайта developerWorks, в том числе параллельно выпускаемые продукты Calisto и Europa.
    • - это виртуальное хранилище перспективных Java-технологий, разрабатываемых в IBM. К ним относятся API, интегрированные среды разработки, комплекты разработчика, эталонные реализации и утилиты. Ниже приведены ссылки на некоторые технологии, представленные в alphaWorks.
    • . Эта утилита помогает анализировать и генерировать пригодные для тестирования Ant-скрипты для сборки проектов, разработанных при помощи Eclipse, Rational и WebSphere IDE для платформ Java EE и SCA.
    • (IBM Pattern Modeling and Analysis Tool for Java Garbage Collector). Данная утилита разбирает подробные трассировочные файлы GC, анализирует использование динамической памяти (кучи) и рекомендует настройки приложения на основе полученных результатов моделирования работы с памятью. (Secure Shell Library for Java) - это легковесная реализация протокола SSH-2, разработанного комитетом IETF (Internet Engineering Task Force). Он предоставляет средства для безопасной аутентификации и другие защищенные сервисы, работающие в условиях незащищенной сети. позволяет консолидировать и преобразовывать данные, тем самым повышая продуктивность, гибкость и производительность вашего бизнеса за счет оперативного доступа к нужной информации.