Docker прокси nginx, откройте ldap и phpldapadmin - не можете получить доступ к администратору ldap через nginx - PullRequest
0 голосов
/ 16 ноября 2018

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

Описание: У меня проблема с доступом к администратору LDAP с использованием контейнера jwilder / nginx-proxy через имя виртуального хоста при доступе через реальный linuxимя хоста с открытым портом работает нормально.Доступ осуществляется по протоколу HTTPS с использованием действующего подстановочного сертификата.

Среда: Я использую Docker в Linux (CentOS 7) и хочу установить один контейнер Docker с jwilder / nginx-proxy и два дополнительныхDocker-контейнеры: один для openLdap, второй для phpLdapAdmin.Таким образом, доступ к моему ldapadmin будет через nginx, без предоставления доступа к портам.

Шаги, сделанные на данный момент:

1.Создать контейнер - прокси nginx

docker run -d -p 80:80 -p 443:443 \
  -v /home/admin/nginx/certs:/etc/nginx/certs \
  -v /var/run/docker.sock:/tmp/docker.sock:ro \
  --name proxy \
  jwilder/nginx-proxy

2.Создайте контейнер - ldap

docker run --name ldap -p 636:636 \ 
 -v /home/admin/nginx/certs:/container/service/slapd/assets/certs \
 -v /data/slapd/database:/var/lib/ldap \
 -v /data/slapd/config:/etc/ldap/slapd.d \
 --hostname ldap.company.com \
 --add-host=ldap.company.com:192.168.168.168 \
 --env LDAP_ORGANISATION='Company ltd' \
 --env LDAP_DOMAIN='company.com' \
 --env LDAP_ADMIN_PASSWORD='Password' \
 --detach osixia/openldap:1.2.2 \

Вместо "192.168.168.168" мой реальный публичный IP-адрес

Затем успешно выполните поиск LDAP

docker exec ldap \
  ldapsearch -x -H ldap://ldap.company.com \
  -b dc=company,dc=com \
  -D "cn=admin,dc=company,dc=com" \
  -w Password\

3.Создайте контейнер phpldapadmin

docker run \
 --name ldapadmin \
 --env PHPLDAPADMIN_LDAP_HOSTS=ldap.company.com \ 
 --expose 389 \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=389 \
 --volume /home/admin/nginx/certs:/container/service/phpldapadmin/assets/apache2/certs \
--env PHPLDAPADMIN_HTTPS_CRT_FILENAME=ldap.company.com.crt \
--env PHPLDAPADMIN_HTTPS_KEY_FILENAME=ldap.company.com.key \
--env PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME=ldap.company.com.crt \
--detach osixia/phpldapadmin:0.7.2

И, наконец, перезапустите контейнер прокси-сервера nginx для автоматического добавления ldap и ldapadmin в конфигурацию nginx.

Перезапустите прокси-сервер Docker

Затем я получаю этооткрытые порты:

ИМЯ ПОРТОВ ИЗОБРАЖЕНИЙ

osixia / phpldapadmin: 0.7.2 80 / tcp, 389 / tcp, 443 / tcp ldapadmin

osixia / openldap: 1.2.2389 / tcp, 0.0.0.0:636->636/tcp ldap

Теперь начинается странная часть: имя хоста моего сервера Linux - dev.company.com с некоторым публичным адресом, и я могу получить доступ к своему ldapadmin с помощьюhttps://dev.company.com:6443, но я не могу получить доступ через URL: ldap.company.com, не выставляя порты.Я не могу пропинговать ldap.company.com.key на самом хосте Linux.

Примечание: Я сделал то же самое для Дженкинса:

docker run -d --rm -u root -v /var/run/docker.sock:/var/run/docker.sock -v jenkins-data: / var / jenkins_home -v "$ HOME": / home -e VIRTUAL_HOST = jenkins.company.com -e VIRTUAL_PORT = 8080 - имя nj jenkins

и для артефакта:

запуск докера - имя артефакта -d -v / var / opt / jfrog / artifactory: / var /opt / jfrog / artifactory -e VIRTUAL_HOST = artifactory.company.com -e VIRTUAL_PORT = 8081 artifactory-oss

и для обоих из этих двух URL-адресов, которые могут быть проверены, они возвращают мой публичный IP-адрес, и я успешнодоступ к ним через браузер: jenkins.company.com и artifactory.company.com

Я не могу пропинговать ldap.company.com.key на самом хосте Linux.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

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

1.Создать контейнер - прокси nginx

docker run -d -p 80:80 -p 443:443 \
  -v /home/admin/nginx/certs:/etc/nginx/certs \
  -v /var/run/docker.sock:/tmp/docker.sock:ro \
  --name proxy \
  jwilder/nginx-proxy

2.Создать контейнер -LDAP

docker run --name ldap \
 -v /home/admin/nginx/certs:/container/service/slapd/assets/certs \
 -v /data/slapd/database:/var/lib/ldap -v /data/slapd/config:/etc/ldap/slapd.d \
 --hostname ldap.company.com --add-host=ldap.company.com:192.168.168.168 \
 --expose 443 \
 --env LDAP_ORGANISATION='Company ltd' \
 --env LDAP_DOMAIN='company.com' \
 --env LDAP_ADMIN_PASSWORD='Password' \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=443 \
 --detach osixia/openldap:1.2.2

3.Создать контейнер - PHPLDAPADMIN

docker run --name ldapadmin \
 -p 6443:443 \
 --env PHPLDAPADMIN_LDAP_HOSTS=ldap.company.com \
 -e VIRTUAL_HOST=ldap.company.com \
 -e VIRTUAL_PORT=443 \
 --expose 443 \
 --hostname ldap.company.com \
 --volume /home/admin/nginx/certs:/container/service/phpldapadmin/assets/apache2/certs \
 --env PHPLDAPADMIN_HTTPS_CRT_FILENAME=ldap.company.com.crt \
 --env PHPLDAPADMIN_HTTPS_KEY_FILENAME=ldap.company.com.key \
 --env PHPLDAPADMIN_HTTPS_CA_CRT_FILENAME=ldap.company.com.crt \
 --detach osixia/phpldapadmin:0.7.2\

Конфигурация в nginx: cat /etc/nginx/conf.d/default.conf

# ldap.company.com
upstream ldap.company.com {
            ## Can be connected with "bridge" network
        # ldapadmin
        server 172.17.0.5:443;
            ## Can be connected with "bridge" network
        # ldap
        server 172.17.0.4:443;
}
server {
server_name ldap.company.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
return 301 https://$host$request_uri;
}
server {
  server_name ldap.company.com;
  listen 443 ssl http2 ;
  access_log /var/log/nginx/access.log vhost;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-******************';
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;
  ssl_certificate /etc/nginx/certs/ldap.company.com.crt;
  ssl_certificate_key /etc/nginx/certs/company.com.key;
  add_header Strict-Transport-Security "max-age=31536000" always;
  location / {
    proxy_pass http://ldap.company.com;
  }
}

Запущенные контейнеры:

[admin@dev ~]$ docker ps
CONTAINER ID  IMAGE                      COMMAND                  CREATED          STATUS         PORTS                                   NAMES
4c021b9f85e4  osixia/phpldapadmin:0.7.2  "/container/tool/run"    9 minutes ago    Up 9 minutes   80/tcp, 0.0.0.0:6443->443/tcp            ldapadmin
53963bfe8fdc  osixia/openldap:1.2.2      "/container/tool/run"    10 minutes ago   Up 10 minutes  389/tcp, 443/tcp, 636/tcp                   ldap
c9576b8c1b72  jwilder/nginx-proxy        "/app/docker-entrypo…"   10 days ago      Up 21 minutes  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   proxy

Журнал из nginx, когда я звоню http://ldap.company.com в браузере: - FAILED

nginx.1    | 2018/11/19 12:46:11 [error] 32#32: *1 upstream prematurely closed connection while reading response header from upstream, client: X:X:X:X, server: ldap.company.com, request: "GET / HTTP/2.0", upstream: "http://172.17.0.5:443/", host: "ldap.company.com"
nginx.1    | 2018/11/19 12:46:11 [error] 32#32: *1 connect() failed (111: Connection refused) while connecting to upstream, client: X:X:X:X, server: ldap.company.com, request: "GET / HTTP/2.0", upstream: "http://172.17.0.4:443/", host: "ldap.company.com"

Вход в nginx, когда я звоню https://ldap.company.com:6443 в браузере - УСПЕХ

nginx.1    | ldap.company.com X:X:X:X - - [19/Nov/2018:12:46:11 +0000] "GET / HTTP/2.0" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

[admin @dev ~] $

Вопросы, которые приходят мне в голову:

  1. Правильно ли я создаю контейнеры?
  2. Нужно ли мне при создании контейнера ldapуказать некоторые порты -p XXX: XX?
  3. Нужно ли экспортировать порты также в ldap и ldapadmin, как я это делал с помощью ключа -expose?
  4. Что я делаю неправильно?

Заранее благодарим всех, кто может помочь, и особенно вас, weibeld, за ваше время и ценные комментарии.

Дополнительная информация:

На контейнере NGINX я получаю эти ошибки:

nginx.1    | ldap.bitconex.de 62.216.206.17 - - [20/Nov/2018:15:52:49 +0000] "GET / HTTP/2.0" 403 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

Поскольку я получаю сообщение об ошибке на ldapadmin:

[Tue Nov 20 15:18:23.807278 2018] [authz_core:error] [pid 1019:tid 140081490781952] [client 172.17.0.3:59916] AH01630: client denied by server configuration: /var/www/html
172.17.0.3 - - [20/Nov/2018:15:18:23 +0000] "GET / HTTP/1.1" 403 373 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

Я искал контейнер ldap-admin, чтобы проверить, какие файлы упоминаются / var / www /HTML, и я обнаружил, что упоминание в двух местах:

1.

root@d65a1005d5aa:/# grep -rnw '/var/' -e '/var/www/html'
/var/lib/dpkg/info/apache2.postinst:111:        for dir in /var/www 
/var/www/html ; do
/var/lib/dpkg/info/apache2.postinst:124:            cp 
/usr/share/apache2/default-site/index.html /var/www/html/index.html
/var/lib/dpkg/info/apache2.postinst:128:        for dir in /var/www 
/var/www/html ; do
/var/lib/dpkg/info/apache2.postrm:70:   if is_default_index_html 
/var/www/html/index.html ; then
/var/lib/dpkg/info/apache2.postrm:71:       rm -f 
/var/www/html/index.html
/var/lib/dpkg/info/apache2.list:223:/var/www/html

2.

root@d65a1005d5aa:/container/service/:apache2/assets/sites-available# 
ls
000-default.conf
root@d65a1005d5aa:/container/service/:apache2/assets/sites-available# 
cat 000-default.com
<VirtualHost *:80>
     # The ServerName directive sets the request scheme, hostname and port that
     # the server uses to identify itself. This is used when creating
     # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
   #ServerName www.example.com

   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/html

   # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
   # error, crit, alert, emerg.
   # It is also possible to configure the loglevel for particular
   # modules, e.g.
   #LogLevel info ssl:warn

   # For most configuration files from conf-available/, which are
   # enabled or disabled at a global level, it is possible to
   # include a line for only one particular virtual host. For example the
   # following line enables the CGI configuration for this host only
   # after it has been globally disabled with "a2disconf".
   #Include conf-available/serve-cgi-bin.conf

   <Directory /var/www/html >
       Require all granted
   </Directory>

</VirtualHost>

Так что я не уверен, что мне нужно вручную создавать эту html-папку или редактировать этот файл на месте 2 и указать путь к файлу конфигурации phpadmin: root @ d65a1005d5aa: / container / service / phpldapadmin / assets / config # lsconfig.php README.md

Или, может быть, указать путь к / var / www / phpldapadmin_bootstrap / htdocs?

0 голосов
/ 17 ноября 2018

Прежде всего, вы можете проверить журналы jwilder/nginx-proxy, если он действительно получает какие-либо запросы:

docker logs -f CONTAINER_ID

Но если вы не можете даже пропинговать ldap.company.com, то, вероятно, домен можетне может быть преобразован в IP-адрес, потому что для него нет записи DNS.Вы можете проверить это с помощью:

host ldap.company.com

Если домен не может быть разрешен, создайте запись DNS A на сервере company.com, которая указывает ldap.company.com на публичный IP-адрес вашего хоста..

Или вы можете проверить, все ли уже работает раньше, если вы просто делаете запросы PHPLDAPAdmin на общедоступный IP-адрес вашего хоста, а не на домен ldap.company.com.

...