Статьи

Настройка Java-приложений для связи с MongoDB, Kerberos и SSL

Алексей Комягин, инженер по техническому обслуживанию MongoDB

Настройка аутентификации Kerberos и шифрования SSL в Java-приложении MongoDB не так проста, как в других языках. В этой статье я покажу вам, как создать Java-приложение с Kerberos и SSL, которое взаимодействует с MongoDB.

Моя оригинальная установка состоит из следующего:

1) Сервер KDC:

kdc.mongotest.com

Файл конфигурации kerberos (/etc/krb5.conf):

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = MONGOTEST.COM
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
 MONGOTEST.COM = {
  kdc = kdc.mongotest.com
  admin_server = kdc.mongotest.com
 }

[domain_realm]
 .mongotest.com = MONGOTEST.COM
 mongotest.com = MONGOTEST.COM

KDC имеет следующие принципы:

  • gssapitest@MONGOTEST.COM — принцип пользователя (для Java-приложения)
  • mongodb/rhel64.mongotest.com@MONGOTEST.COM — принцип обслуживания (для сервера mongodb)

2) Сервер MongoDB:

rhel64.mongotest.com

MongoDB версия: 2.6.0

Конфигурационный файл MongoDB:

dbpath=<some path>
logpath=<some path>
fork=true
auth = true
setParameter = authenticationMechanisms=GSSAPI
sslOnNormalPorts = true
sslPEMKeyFile = /etc/ssl/mongodb.pem

Этот сервер также имеет глобальную переменную среды, $KRB5_KTNAMEустановленную в файл keytab, экспортированный из KDC.

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

{ "_id" : "$external.gssapitest@MONGOTEST.COM", "user" : "gssapitest@MONGOTEST.COM", "db" : "$external", "credentials" : { "external" : true }, "roles" : [ { "role" : "readWrite", "db" : "test" } ] }

Загрузите драйвер Java:

wget http://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.12.1/mongo-java-driver-2.12.1.jar

Установите Java и JDK:

sudo yum install java-1.7.0 sudo yum install java-1.7.0-devel

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

keytool -importcert -file mongodb.crt -alias mongoCert -keystore firstTrustStore

(mongodb.crt является частью публичного сертификата mongodb.pem)

Скопируйте файл конфигурации kerberos на сервер приложений: /etc/krb5.confили «« C: \ WINDOWS \ krb5.ini »` (в противном случае вам придется указать kdc и realm в качестве параметров времени выполнения Java)

Используйте kinit для хранения основного пароля на сервере приложений:

kinit gssapitest@MONGOTEST.COM

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

Скомпилируйте и запустите программу Java

javac -cp ../mongo-java-driver-2.12.1.jar SSLApp.java
java -cp .:../mongo-java-driver-2.12.1.jar -Djavax.net.ssl.trustStore=firstTrustStore -Djavax.net.ssl.trustStorePassword=changeme -Djavax.security.auth.useSubjectCredsOnly=false SSLApp

Важно указать useSubjectCredsOnly=false, в противном случае вы получите исключение «Не предоставлены действительные учетные данные (уровень механизма: не удалось найти любой Kerberos tgt)» из Java. Как мы обнаружили, это не является строго обязательным во всех случаях, но это если вы полагаетесь на kinit для получения сервисного билета.

Драйвер Java должен создать имя участника службы MongoDB для запроса билета Kerberos. Принципал службы создается на основе предоставленного вами имени сервера (если вы явно не попросили канонизировать имя сервера). Например, если я перейду rhel64.mongotest.comна IP-адрес хоста в URI соединения, я получу исключения Kerberos. Недопустимые учетные данные предоставлены (уровень механизма: сервер не найден в базе данных Kerberos (7) — UNKNOWN_SERVER)]. Поэтому убедитесь, что вы указали то же имя хоста сервера, которое вы использовали в принципале Kerberos (). Добавление -Dsun.security.krb5.debug=trueопций времени выполнения Java очень помогает в отладке проблем с аутентификацией Kerberos.

Эти шаги должны помочь упростить процесс подключения приложений Java с помощью SSL. Перед развертыванием любого приложения с MongoDB обязательно ознакомьтесь с нашими 12 советами по началу работы и контрольным списком безопасности, в котором изложены рекомендуемые меры безопасности для защиты вашей установки MongoDB. Более подробную информацию о настройке MongoDB Security можно найти в руководстве MongoDB .

Для дальнейших вопросов, не стесняйтесь связаться с командой MongoDB через Google-группы .