Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-02-11

Установили Naudoc, теперь его надо доточить

Ранее мы установили Python 2.4 на Debian 7 amd64; потом поставили Zope 2.10.7 и сам Naudoc 6. Вместе с сопутствующими библиотеками.
Теперь подключим расширения, типа MySQL и LDAP; поставим фронтэнд Apache httpd.
Лично я выбрал бы Nginx с пробросом через VirtualHostMonster Zope, но в данном случае заказчик захотел сделать «по букварю».

Но, предварительно, разберемся с logrotate для Zope/Naudoc

Из коробки, ни Наудок, ни Zope не настроены на ротацию логов, которые, для нашего конфига, растут в /opt/naudoc/log/
Настройка ротации логов
su -l
nano /etc/logrotate.d/zope
/opt/naudoc/log/*.log {
#    daily
    weekly
    missingok
    rotate 5
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        [ -f /opt/naudoc/var/Z2.pid ] && kill -USR2 `cat /opt/naudoc/var/Z2.pid`
    endscript
}

Поехали.

Для работы интегрированного решения, необходимо установить модуль расширения языка python — mysql-python. Хотя, по словам авторов Наудок, нужды использовать БД MySQL нету. Но модуль мы на всякий случай поставим.
Начнем с установки easy_install для нашего Python 2.4

su -l
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py
/opt/python24/bin/python ez_setup.py

aptitude install mysql-client libmysqlclient-dev
/opt/python24/bin/easy_install mysql-python

Настройка взаимодействия NauDoc с LDAP-сервером требует модуль
python-ldap

su -l
aptitude install libldap-dev openldap-utils slapd
aptitude install libsasl2-dev libsasl2-modules
/opt/python24/bin/easy_install pyasn1
/opt/python24/bin/easy_install pyasn1_modules
wget https://pypi.python.org/packages/source/p/python-ldap/python-ldap-2.4.18.tar.gz#md5=9bee878cc3582d7184b0a48083446efb
tar xvzf python-ldap-2.4.18.tar.gz
cd python-ldap-2.4.18

Компилять сразу бесполезно, сначала надо поправить конфиг с учетом того, что библиотеки теперь находятся чуть-чуть не там где раньше

find / -iname "*ldap*.h"
    /usr/include/ldap.h
find / -iname "*ldap*.a"
    /usr/lib/x86_64-linux-gnu/libldap.a

nano setup.cfg

diff -u setup.cfg.orig setup.cfg
--- setup.cfg.orig      2014-11-27 00:32:55.989686001 +0300
+++ setup.cfg   2014-11-27 00:36:11.937686000 +0300
@@ -1,10 +1,10 @@
 [_ldap]
-library_dirs = /opt/openldap/lib64 /usr/lib
+library_dirs = /opt/openldap/lib64 /usr/lib /usr/lib/x86_64-linux-gnu
 include_dirs = /opt/openldap/include /usr/include/sasl /usr/include
 defines = HAVE_SASL HAVE_TLS HAVE_LIBLDAP_R
 extra_compile_args =
 extra_objects =
-libs = ldap_r
+libs = ldap_r lber sasl2 ssl crypto

 [install]
 compile = 1

Вот теперь можно компилять
/opt/python24/bin/python setup.py clean --all
/opt/python24/bin/python setup.py build
/opt/python24/bin/python setup.py install

Перезапуск Zope/NauDoc
service zope2.10 stop; service zope2.10 start

После того как сервер будет запущен, зайдите в NauDoc по стандартной ссылке:
http://localhost:8080/docs и следуйте инструкциям мастера первого запуска, там все несложно.

Для активации модулей NauDoc Pro необходимо зайти в систему под учетной записью администратора, затем перейти на вкладку «Сервис», пункт меню «Модули расширения». Там будет много галочек.

Чтобы активировать модуль расширения "Внешнее хранение файлов", недостаточно только поставить галочку. Надо еще включить опцию в конфигурации в исходном коде
nano /opt/naudoc/Products/CMFNauTools/Config.py
EnableFSStorage         = 1

Перезапустить
service zope2.10 stop; service zope2.10 start

Открыть корневую страницу системы http://localhost:8080/docs
и следовать указаниям мастера. По завершении
проверка наличия файлов во внешней папке
find /opt/naudoc/var/docs/


Настройка работы NauDoc через Apache

Установка веб-сервера Apache httpd и направление трафика сайта через него.
Открыт доступ только через HTTPS и только к системе документооборота. Доступ к Zope возможен только через создание SSH туннеля.
Доступ к сайту будет регулироваться через проверку крипто ключей.

Для Apache нужен модуль mod_fastcgi, согласно ванильной кофигурации.
Для его установки надо пополнить список доступных репозиториев пакетов
su -l
nano /etc/apt/sources.list
deb http://cdn.debian.net/debian/ wheezy main contrib non-free
deb-src http://cdn.debian.net/debian/ wheezy main contrib non-free
deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free
deb http://cdn.debian.net/debian/ wheezy-updates main contrib non-free
deb-src http://cdn.debian.net/debian/ wheezy-updates main contrib non-free

aptitude update
aptitude install apache2-mpm-itk apache2 openssl libapache2-mod-fcgid
aptitude install libapache2-mod-fastcgi

Создание и настройка сайта Apache httpd

a2dissite default
cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-available/naudoc-ssl.conf
a2ensite naudoc-ssl.conf
a2enmod ssl
a2enmod fastcgi
a2enmod rewrite

Сертификат сайта

mkdir -p /etc/ssl/localcerts
openssl req -newkey rsa:2048 -x509 -days 3650 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key -subj "/C=RU/ST=Moscow/L=Moscow/O=Mycompany/OU=Mycompany DMS/CN=mydomain.net"
chmod 600 /etc/ssl/localcerts/apache*

Конфиги

nano /etc/apache2/sites-available/naudoc-ssl.conf
ServerName mydomain.net
<IfModule mod_ssl.c>
NameVirtualHost *:443
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

    SSLEngine on
    SSLCertificateFile    /etc/ssl/localcerts/apache.pem
    SSLCertificateKeyFile /etc/ssl/localcerts/apache.key

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    <Directory "/var/www/naudoc">
        Order allow,deny
        Allow from all
        Options FollowSymLinks Includes ExecCGI
        AllowOverride All
        SetHandler fastcgi-script
    </Directory>
    FastCgiExternalServer /var/www/naudoc -socket /var/run/zope.soc -idle-timeout 600 -pass-header Authorization
    RewriteEngine on
    RewriteRule !^/dms/(.*) /dms/ [R]
    RewriteRule ^/dms/docs/(.*) /var/www/naudoc/docs/$1
    RewriteRule ^/dms/(.*) /var/www/naudoc/docs/$1

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

nano /etc/apache2/ports.conf
<IfModule mod_ssl.c>
    Listen 443
</IfModule>
<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

nano /opt/naudoc/etc/zope.conf
#… модифицированные строки, весь файл слишком велик для полного цитирования
<fast-cgi>
    address /var/run/zope.soc
</fast-cgi>
#...

Перезапуск
service zope2.10 stop; service zope2.10 start
service apache2 stop; service apache2 start

Диагностика веб-служб
netstat -ltupn
curl -k https://localhost/
openssl s_client -connect mydomain.net:443 -state -debug
apache2 -v
    Server version: Apache/2.2.22 (Debian)
    Server built:   Jul 24 2014 15:34:03

В общем, теперь оно должно работать. Можно на этом и остановиться.
Но нам надо больше!

А теперь закрутим гайки

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

Настройка проводится в три шага:
1 Создать собственный доверенный сертификат (Certificate Authority), для того чтобы с помощью него подписывать и проверять клиентские сертификаты.
2 Создать клиентские сертификаты, подписанные доверенным сертификатом, для последующей передачи их клиентам.
3 Сконфигурировать веб-сервер для запроса и проверки клиентских сертификатов.

Команды, создающие
самоподписанный ключ CA

su -l
mkdir -p ~/CA && cd $_
openssl req -new -sha256 -newkey rsa:4096 -nodes -keyout ca.key -x509 -days 3650 \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Portal/OU=DMS/CN=Portal CA/emailAddress=naudoc@dms.ru" \
    -out ca.crt
# посмотреть данные ключа и сертификата
openssl rsa -noout -text -in ca.key|less
openssl x509 -noout -text -in ca.crt|less

Создайте конфигурационный файл с именем ca.config следующего содержания

nano ca.config
[ ca ]
default_ca             = CA_CLIENT       # При подписи сертификатов
# использовать секцию CA_CLIENT
[ CA_CLIENT ]
dir                    = ./db            # Каталог для служебных файлов
certs                  = $dir/certs      # Каталог для сертификатов
new_certs_dir          = $dir/newcerts   # Каталог для новых сертификатов
database               = $dir/index.txt  # Файл с базой данных
# подписанных сертификатов
serial                 = $dir/serial     # Файл содержащий серийный номер
# сертификата (в шестнадцатиричном формате)
certificate            = ./ca.crt        # Файл сертификата CA
private_key            = ./ca.key        # Файл закрытого ключа CA
default_days           = 365             # Срок действия подписываемого
# сертификата
default_crl_days       = 365             # Срок действия CRL (см. $4)
default_md             = sha256          # Алгоритм подписи
policy                 = policy_anything # Название секции с описанием
# политики в отношении данных сертификата
[ policy_anything ]
countryName            = optional     # Код страны - не обязателен
stateOrProvinceName    = optional     # ......
localityName           = optional     # ......
organizationName       = optional     # ......
organizationalUnitName = optional     # ......
emailAddress           = optional     # ......
commonName             = supplied     # ...... - обязателен

Создайте структуру каталогов и файлов, соответсвующую описанной в конфигурационном файле

mkdir db
mkdir db/certs
mkdir db/newcerts
touch db/index.txt
echo "01" > db/serial

Создание клиентского закрытого ключа и запроса на сертификат (CSR)

Для создания подписанного клиентского сертификата предварительно необходимо создать запрос на сертификат, для его последующей подписи

Ключ и сертификат для веб-сервера (Apache)
openssl req -new -sha256 -newkey rsa:4096 -nodes -keyout apache.key -days 3650\
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Portal/OU=DMS/CN=mydomain.net" \
    -out apache.csr
# посмотреть данные ключа и запроса
openssl rsa -noout -text -in apache.key|less
openssl req -noout -text -in apache.csr|less

Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA). При подписи запроса используются параметры заданные в файле ca.config

openssl ca -config ca.config -in apache.csr -out apache.crt -batch -days 3650
cp ./db/newcerts/01.pem ./apache.pem
# посмотреть данные сертификата
openssl x509 -noout -text -in apache.crt|less
# отозвать сертификат
openssl ca -config ca.config -revoke apache.pem
# or
openssl ca -config ca.config -revoke apache.crt

Подготовка данных для передачи клиенту (это уже не про Apache).
Для передачи полученных в результате предыдущих операций файлов клиенту, обычно используется файл в формате
PKCS#12
Пример:
openssl pkcs12 -export -in apache.crt -inkey apache.key \
    -certfile ca.crt -out apache.p12 -passout pass:secret

Еще один пример,
создание сертификата для клиента
vasnake@gmail.com

su -l
pushd ~/CA
openssl req -new -sha256 -newkey rsa:4096 -nodes -keyout valik.key -days 3650\
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Portal/OU=DMS/CN=vasnake@gmail.com/emailAddress=vasnake@gmail.com" \
    -out valik.csr
openssl ca -config ca.config -in valik.csr -out valik.crt -batch -days 3650
openssl pkcs12 -export -in valik.crt -inkey valik.key \
    -certfile ca.crt -out valik.p12 -passout pass:secret
chmod -R 600 ../CA
echo "cert in attachment" | mutt -a "valik.p12" -s "portal keys" -- vasnake@gmail.com

Создание списка отзыва (CRL)
Список отзыва нужен для блокирования вышедших из употребления сертификатов. В конфигурации CA указано, что список отзыва надо обновлять не реже раза в год.

openssl ca -gencrl -config ca.config -out ca.crl
# посмотреть
openssl crl -in ca.crl -text -noout|less
chmod -R 600 ../CA

Настройка веб-сервера

Для реализации процесса авторизации по клиентским сертификатам необходимо сконфигурировать веб-сервер для решения следующих задач:
1. Запрет доступа к защищаемой области по протоколу HTTP
2. Запрос и проверка клиентских сертификатов

Скопировать сертификаты и ключи в папку с конфигами

cp apache.crt /etc/ssl/localcerts/apache.crt
cp apache.key /etc/ssl/localcerts/apache.key
cp ca.crt /etc/ssl/localcerts/ca.crt
cp ca.crl /etc/ssl/localcerts/ca.crl

Отредактировать конфиг сайта

nano /etc/apache2/sites-available/naudoc-ssl.conf
ServerName mydomain.net
<IfModule mod_ssl.c>
NameVirtualHost *:443
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
        SSLRequireSSL
        SSLVerifyClient require
        SSLRequire %{SSL_CLIENT_I_DN_O} eq "Portal" \
            and %{SSL_CLIENT_I_DN_OU} in {"DMS", "IT"}
# Журнал ошибок Апача показал
# ERROR request body exceeds maximum size (131072) for SSL buffer
# при попытке сохранить на сервер объемный шаблон документа, поэтому:
        SSLRenegBufferSize 10485760
    </Directory>
    <Directory "/var/www/naudoc">
        Order allow,deny
        Allow from all
        Options FollowSymLinks Includes ExecCGI
        AllowOverride All
        SetHandler fastcgi-script
    </Directory>
    FastCgiExternalServer /var/www/naudoc -socket /var/run/zope.soc -idle-timeout 600 -pass-header Authorization
    RewriteEngine on
    RewriteRule !^/dms/(.*) /dms/ [R]
    RewriteRule ^/dms/docs/(.*) /var/www/naudoc/docs/$1
    RewriteRule ^/dms/(.*) /var/www/naudoc/docs/$1
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    SSLEngine on
    SSLCACertificateFile /etc/ssl/localcerts/ca.crt
    SSLCARevocationFile /etc/ssl/localcerts/ca.crl
    SSLCertificateFile    /etc/ssl/localcerts/apache.crt
    SSLCertificateKeyFile /etc/ssl/localcerts/apache.key
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
    </Directory>
    BrowserMatch "MSIE [2-6]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

Настройка веб-сервера на перенаправление пользователей с http на https
чтобы пользователя, зашедшего на http://mydomain.net/
отправляли на https://mydomain.net/

открыть порт в файрволле

nano /etc/iptables.up.rules
# Generated by iptables-save v1.4.14 on Sun Nov 23 03:00:39 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [12:2680]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m recent --update --seconds 55 --name DEFAULT --rsource -j DROP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m recent --set --name DEFAULT --rsource -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Nov 23 03:00:39 2014
# EOF

bash /root/disable_fw.sh
bash /etc/network/if-pre-up.d/iptables

сконфигурить Апач

nano /etc/apache2/ports.conf
Listen 80
<IfModule mod_ssl.c>
    Listen 443
</IfModule>
<IfModule mod_gnutls.c>
    Listen 443
</IfModule>
# EOF

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/naudoc.conf
nano /etc/apache2/sites-available/naudoc.conf
ServerName mydomain.net
NameVirtualHost *:80
<VirtualHost *:80>
   Redirect permanent / https://mydomain.net/
</VirtualHost>
# EOF

a2ensite naudoc.conf
service apache2 stop; service apache2 start


Вот как-то так.

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


original post http://vasnake.blogspot.com/2015/02/naudoc.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) Klaipeda (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) купи/продай (9) Photo (8) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)