ProFTPd – FTPs, sFTP и виртуальные пользователи

Задача сделать доступ виртуальным пользователям каждому в свою домашнюю директорию (т.е. chroot) по FTP, FTPs и sFTP.

# yum install proftpd proftpd-utils

Разрешаем сервис и запускаем его:

$ sudo systemctl enable proftpd
$ sudo systemctl start proftpd

Firewall:

# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 20:21 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW --dport 40900:40999 -j ACCEPT

Открываем конфиг /etc/proftpd.conf добавляем туда строки:

ServerName "FTP SERVER"
ServerType standalone
DefaultServer on

Port 21
Umask 022

DefaultAddress 192.168.0.1 192.168.1.41
SocketBindTight on
RequireValidShell off
AuthUserFile /etc/proftpd.d/ftpd.passwd
UseIPv6 off
IdentLookups off
PassivePorts 40900 40999

MaxInstances 30
CommandBufferSize 512

User nobody
Group nobody
LangEngine on
LangPath /usr/share/locale.
UseEncoding UTF-8 WINDOWS-1251

DefaultRoot ~
AllowOverwrite on

# Bar use of SITE CHMOD by default
<Limit SITE_CHMOD>
  AllowAll
</Limit>
<Directory ~>
  AllowOverwrite on
  AllowStoreRestart on
 <Limit Write>
    AllowAll
 </Limit>
 <Limit READ>
    AllowAll
 </Limit>
</Directory>
<Global>
   PassivePorts 40900 40999
   AuthUserFile /etc/proftpd.d/ftpd.passwd
   #RequireValidShell off
   MaxLoginAttempts 6
   LangEngine on
   UseEncoding UTF-8 WINDOWS-1251
   DefaultRoot ~ !admins
   # Добавляем возможность перезаписи файлов
   AllowOverwrite on
</Global>

Добавляем пользователя

# adduser imp -s /sbin/nologin -d /home/imp

Проверяем

# vipw
imp:x:1002:1003::/home/imp:/sbin/nologin

Добавляем в группу

# usermod -aG www-data imp

Смотрим uid/gid

# id imp
uid=1002(imp) gid=1003(imp) группы=1003(imp),1001(www-data)

Создаем пару Логин-Пароль

# mkdir /etc/proftpd.d/
# ftpasswd --passwd --file=/etc/proftpd.d/ftpd.passwd --name=imp --uid=1002 --gid=1001 --home=/home/imp --shell=/sbin/nologin

Эту же процедуру повторяем для всех пользователей.

Сменить пароль можно командой

# ftpasswd --passwd --file=/etc/proftpd.d/ftpd.passwd --name=imp --change-password

Проверяем и перечитываем конфигурацию

# proftpd -t
# proftpd -s reload

Настройка ProFTPD на использование TLS/SSL протокола

# mkdir /etc/proftpd.d/ssl/

# openssl req -x509 -days 3650 -nodes -newkey rsa:1024 -keyout /etc/proftpd.d/ssl/proftpd.key -out /etc/proftpd.d/ssl/proftpd.crt
Country Name (2 letter code) [XX]:UA
State or Province Name (full name) []:Kiev
Locality Name (eg, city) [Default City]:Kiev
Organization Name (eg, company) [Default Company Ltd]:OfficeLTD
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:ftp.domen.com
Email Address []:postmaster@domen.com

# chmod 600 /etc/proftpd.d/ssl/proftpd.key

Добавляем в proftpd.conf

# nano /etc/proftpd.conf

#LoadModule mod_tls.c.
<VirtualHost 192.168.1.41>
  MasqueradeAddress ftp.domen.com
  TLSEngine on
  Port 1021
  TLSLog /var/log/proftpd/tls.log
  TLSProtocol SSLv23
  TLSRequired auth
  #TLSOptions NoCertRequest
  TLSRSACertificateFile /etc/proftpd.d/ssl/proftpd.crt
  TLSRSACertificateKeyFile /etc/proftpd.d/ssl/proftpd.key
  TLSVerifyClient off
</VirtualHost>

Разрешаем порт 1021 в iptables:

# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 1021 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW --dport 40900:40999 -j ACCEPT

Пробуем соединиться например клиентом FileZila с такими настройками:

 

Доступ по sFTP

Добавляем в /etc/proftpd.conf после секции <Global></Global>

LoadModule mod_sftp.c
<VirtualHost 192.168.1.41>
  MasqueradeAddress ftp.domen.com
  SFTPEngine on
  Port 8022
  #SFTPHostKey /etc/ssh/ssh_host_ed25519_key
  SFTPHostKey /etc/ssh/ssh_host_rsa_key
  SFTPHostKey /etc/ssh/ssh_host_ecdsa_key
  SFTPLog /var/log/proftpd/sftp.log
  SFTPCompression off
</VirtualHost>

Разрешаем порт 8022 (или любой другой незанятый, желательно выше 1024)

# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8022 -j ACCEPT

Проверяем и перечитаем конфигурацию

# proftpd -t
# proftpd -s reload

Если такая ошибка:

proftpd[15477]: fatal: SFTPHostKey: unable to use '/etc/ssh/ssh_host_rsa_key' as host key, as it is group- or world-accessible on line 78 of '/etc/proftpd.conf'

Меняем права доступа

# chmod 600 /etc/ssh/ssh_host_rsa_key

И для ключа юзера выполнить (не уверен):

# ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa

Пробуем соединиться:

 

Пасивный режим и iptables

Необходимо загрузить модуль ip_conntrack_ftp для iptables. В RedHat/CentOS достаточно в файл /etc/sysconfig/iptables-config добавить ссылку на загрузку модуля ip_conntrack_ftp:

# nano /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"

Добавить:

#nano /etc/sysconfig/proftpd
PROFTPD_OPTIONS="-DTLS"

nano iptables (у меня присутствует и NAT):

# Load needed modules
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
....
# FTP, sFTP, FTPs
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 8022 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 1021 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 40900:40999 -j ACCEPT
....

Логирование

Создаем файлы:

# touch /var/log/proftpd/{proftpd,xfer,access,auth}.log

Настраиваем логирование ftp:

# cat /etc/proftpd.conf
....
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xfer.log
ExtendedLog /var/log/proftpd/access.log WRITE,READ write
ExtendedLog /var/log/proftpd/auth.log AUTH auth
DebugLevel 9
.....

Отладка

Есть шикарный механизм отладки. Прежде чем запустить его, нужно остановить сервис:

# service proftpd stop

Режим DEBUGа (-d – выбор уровня логирования)

# proftpd -n -d 9 -c /etc/proftpd.conf

Защита

Добавим защиту в fail2ban. Создаем клетку и правим фильтр:

cat /etc/fail2ban/jail.d/proftpd.conf
[proftpd]
enabled = true
filter = proftpd
logpath = /var/log/proftpd/proftpd.log
maxretry = 3
ignoreip = 127.0.0.1/8 192.168.0.0/24
#backend = polling
port = ftp,ftp-data,ftps,ftps-data
#logpath = %(proftpd_log)s
#backend = %(proftpd_backend)s
backend = gamin
cat /etc/fail2ban/filter.d/proftpd.conf
[Definition]
failregex = USER \S+: no such user found from \S* ?\[<HOST>\] to \S+\s*$
ignoreregex =

Перезапускаем и проверяем:

# service proftpd restart
# service fail2ban restart
# fail2ban-client status proftpd

Итог

Мы создали FTP сервер с возможностью подключения виртуальных пользователей по FTP, sFTP, FTPs, при этом каждый из пользователей не попадет выше своей директории.

Источники

https://www.dmosk.ru/instruktions.php?object=proftpd-centos7
https://sys-adm.in/os/nix/539-centod-install-proftpd.html
http://unixblog.org.ua/proftpd/install-proftpd-centos-7-auth-via-authuserfile/

Iptables и пассивный режим FTP
https://www.homeless.su/linux-tipstricks/iptables-i-passivnyj-rezhim-ftp/

Log
https://sys-adm.in/os/nix/496-loggining-proftpd-in-centos.html

image_pdfimage_print

owncloud как subdomen

ownCloud — это свободное и открытое веб-приложение для синхронизации данных, общего доступа к файлам и удалённого хранения документов в «облаке».

Доступны клиенты для синхронизации данных с ПК под управлением Windows, OS X или Linux и с мобильными устройствами на iOS и Android. Кроме того, сохранённые данные доступны через веб-интерфейс ownCloud в любом браузере.

Доступ к облаку будет как субдомену, cloud.domen.com поэтому не забыть прописать в DNS.

Ставим последнюю стабильную версию:

# rpm --import https://download.owncloud.org/download/repositories/stable/CentOS_7/repodata/repomd.xml.key
# curl -L https://download.owncloud.org/download/repositories/stable/CentOS_7/ce:stable.repo -o /etc/yum.repos.d/ownCloud.repo
# yum install owncloud

Доустановим модули (если их нет) для owncloud:

$ sudo yum install php56w-xml php56w-gd php56w-intl php56w-mbstring

Сменим права и владельца:

# chmod -R 755 /var/www/html/owncloud
# chown -R nginx:www-data /var/www/html/owncloud
# chown -R nginx:www-data /var/lib/php/session

Установим memcached:

# yum install memcached php56w-pecl-memcache php56w-pecl-memcached php56w-pecl-apcu
# nano /etc/sysconfig/memcached
 PORT="11211"
 USER="memcached"
 MAXCONN="1024"
 CACHESIZE="64"
 OPTIONS="-l 127.0.0.1 -U 0"

Чтобы убедиться, что Memcached запущен и работает, введите следующее:

# memstat --servers="127.0.0.1"
 Server: 127.0.0.1 (11211)
 pid: 3831
 uptime: 9
 time: 1520028517
 version: 1.4.25
 ....

Устанавливаем Redis:

# yum install redis php56w-pecl-redis

Создаем конфиг для cloud пула:

# nano /etc/php-fpm.d/cloud.domen.com.conf

[cloud.tst-amo.net.ua]
listen = /var/run/php-fpm/cloud.domen.com.sock
listen.mode = 0666
user = nginx
group = www-data
chdir = /var/www/html/owncloud

# В зависимости от нагрузки меняем параметры
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

# Default Value: clean env
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Создаем vhost cloud.domen.com:

# nano /etc/nginx/sites-available/owncloud

upstream php-handler {
    #server 127.0.0.1:9000;
    server unix:/var/run/php-fpm/cloud.domen.com.sock;
}

server {
    listen 80;
    server_name cloud.domen.com;

    # For Lets Encrypt, this needs to be served via HTTP
    location /.well-known/acme-challenge/ {
        root /var/www/html/owncloud; # Specify here where the challenge file is placed
    }
    
    # enforce https
    location / {
        return 301 https://$server_name$request_uri;
    }
 }

server {
    listen 443 ssl http2;
    server_name cloud.domen.com www.cloud.domen.com;

    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    include /etc/nginx/conf.d/ssl.conf;

    # Path to the root of your installation
    root /var/www/html/owncloud/;
    index index.php;

    location = /robots.txt {
         allow all;
         log_not_found off;
         access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

    location = /.well-known/carddav {
          return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
          return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 10G;
    fastcgi_buffers 64 4K; # Please see note 1
    fastcgi_ignore_headers X-Accel-Buffering; # Please see note 2
    fastcgi_busy_buffers_size 192K;

    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location / {
       rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
       return 404;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
       return 404;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param SCRIPT_NAME $fastcgi_script_name; # necessary for owncloud to detect the contextroot https://github.com/owncloud/core/blob/v10.0.0/lib/private/AppFramework/Http/Request.php#L603
       fastcgi_param PATH_INFO $fastcgi_path_info;
       fastcgi_param HTTPS on;
       fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
       fastcgi_param front_controller_active true;
       fastcgi_read_timeout 180; # increase default timeout e.g. for long running carddav/ caldav syncs with 1000+ entries
       fastcgi_pass php-handler;
       fastcgi_intercept_errors on;
       fastcgi_request_buffering off; #Available since NGINX 1.7.11
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri $uri/ =404;
        index index.php;
    }

    # Make sure it is BELOW the PHP block
    location ~ \.(?:css|js)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "max-age=15778463";
        # Add headers to serve security related headers (It is intended to have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into this topic first.
        #add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~ \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg|map)$ {
       add_header Cache-Control "public, max-age=7200";
       try_files $uri /index.php$uri$is_args$args;
       # Optional: Don't log access to other assets
       access_log off;
    }
 }
# ln -s /etc/nginx/sites-available/owncloud /etc/nginx/sites-enabled/

Проверяем и перезапускаем сервисы:

# nginx -t
# nginx -s reload
# service php-fpm restart
# service memcached restart

Заходим для дальнейшей настройки:

https://cloud.domen.com

После настройки приводим файл к такому виду:

# nano /var/www/html/owncloud/config/config.php
<?php
$CONFIG = array (
   'updatechecker' => false,
   'instanceid' => 'ocz4p432td1qkl',
   'passwordsalt' => 'IM1w1S8PbkjlwsbB4NcyW7cfT/pemjr',
   'secret' => '6Jxca0r8+zlklkml8Zi00TKfGY1gqeLxK9VeNOx',
   'trusted_domains' =>
   array (
     0 => 'cloud.domen.com',
   ),
   'datadirectory' => '/var/www/html/owncloud/data',
   'overwrite.cli.url' => 'https://cloud.domen.com',
   'dbtype' => 'mysql',
   'version' => '10.0.9.5',
   'dbname' => 'owncloud',
   'dbhost' => 'localhost',
   'dbtableprefix' => 'oc_',
   'dbuser' => 'owncloud',
   'dbpassword' => '9rtgu76yhgjkjghk8u',
   'logtimezone' => 'Europe/Kiev',
   'installed' => true,
   'filelocking.enabled' => 'true',
   
   'memcache.local' => '\\OC\\Memcache\\APCu',
   'memcache.distributed' => '\\OC\\Memcache\\Redis',
   'memcache.locking' => '\\OC\\Memcache\\Redis',
   'memcached_servers' =>
   array (
     0 =>
     array (
       0 => 'localhost',
       1 => 11211,
     ),
   ),
   'redis' =>
   array (
    'host' => 'localhost',
    'port' => 6379,
    'timeout' => 0,
    'password' => '',
    'dbindex' => 0,
   ),

   'mail_domain' => 'domen.com',
   'mail_from_address' => 'user',
   'mail_smtpmode' => 'smtp',
   'mail_smtpauthtype' => 'LOGIN',
   'mail_smtpauth' => 1,
   'mail_smtphost' => 'mail.domen.com',
   'mail_smtpport' => '25',
   'mail_smtpsecure' => 'tls',
   'mail_smtpname' => 'user',
   'mail_smtppassword' => 'user_password',
);

Перенесем для удобства обслуживания /var/www/html/owncloud/data в /home/www/owncloud/data

Вариант 1.

# mv /var/www/html/owncloud/data /var/www/html/owncloud/data_old
# cp -rp /var/www/html/owncloud/data_old /home/www/owncloud/data
# ln -s /home/www/owncloud/data /var/www/html/owncloud/

Или так:

Вариант 2.

Перемещаем хранилище файлов на выделенную партицию для этих целей:

$ sudo mkdir /ftp/owncloud
$ sudo chown nginx:www-data owncloud
$ sudo service nginx stop
$ sudo rsync -avz /var/www/html/owncloud/data /ftp/owncloud
$ sudo nano /var/www/html/owncloud/config/config.php

/* 'datadirectory' => '/var/www/html/owncloud/data', /*
 'datadirectory' => '/ftp/owncloud/data',
$ sudo service nginx start

Лог находится:
/var/www/html/owncloud/data/owncloud.log

 

image_pdfimage_print

Plogsuum

Один из парсеров получения статистики работы почтового сервера – pflogsumm. В основу заложен анализ лога /var/log/maillog без привязки к конкретному программному обеспечению (это может Postfix, Sendmail, Exim и так далее) и дистрибутиву Linux/FreeBSD (CentOS, Debian, …). В результате мы получим данные по отправленным сообщениям, полученным, заблокированным, отброшенным.

# yum install postfix-perl-scripts

Просмотр статистики за вчерашний день:

# perl /usr/sbin/pflogsumm -d yesterday /var/log/maillog

Вставляем в cron с пересылкой на свою почту

#crontab -e
59 23 * * * /usr/sbin/pflogsumm /var/log/maillog | mail -s 'Statistics from Postfix f11.uni.ka' postmaster@uni.ka

Скрипт для сброса статистики в файл:

mkdir /var/log/postfix
cat /usr/local/etc/postfix/poststat.sh
#!/bin/sh
/usr/sbin/pflogsumm -e /var/log/maillog > /var/log/postfix/`date +%Y-%m-%d`-stat_postfix.txt

chown 0755 poststat.sh
crontab -e
59 23 * * * /etc/postfix/poststat.sh > /dev/null
image_pdfimage_print

Postfix + Dovecot + Postfixadmin + Roundcube + Postgrey + DKIM

Настройка системы:

# cat /etc/hosts
127.0.0.1 localhost localhost.tst-amo.net.ua localhost4 localhost4.tst-amo.net.ua
::1 localhost localhost.tst-amo.net.ua localhost6 localhost6.tst-amo.net.ua

192.168.1.41 mail mail.tst-amo.net.ua
192.168.1.41 mail.tst-amo.net.ua.
# cat /etc/aliases

# Basic system aliases -- these MUST be present.
mailer-daemon: postmaster
postmaster: root
root: pm@tst-amo.net.ua # учетка на которую будет пересылаться почта root

# General redirections for pseudo accounts.
bin: root
daemon: root
# hostname
tst.tst-amo.net.ua

Очень желателен PTR (прописывается у провайдера по заявке, у моего нельзя)

Например:

# nslookup 222.444.22.63
Server: 192.168.1.41
Address: 192.168.1.41#53

Non-authoritative answer:
222.444.22.63.in-addr.arpa name = mail.domen.ua.

Предполагается, что уже установлены и настроены MySQL, nginx.

1. MySQL

Создаем базу данных:

# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE postfix;
Query OK, 1 row affected (0.03 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.10 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> quit

2. Postfixadmin

# wget -q -O - "https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz" | tar -xzf - -C /home/www/
# yum install php56w-imap
# chown -R nginx:www-data /home/www/postfixadmin

– где nginx:www-data – пользователь под которым запускается nginx и группа

После обновления сменился владелец /var/lib/php/session и выдало ошибку в браузере

Invalid token

в логах ругань на permission, так как, владельцем стал root:apache:

2018/08/18 08:55:06 [error] 1786#0: *9149 FastCGI sent in stderr: "PHP message: PHP Warning: session_start(): open(/var/lib/php/session/sess_7p6c8kjkosj36d0lehjjr4eeg
6, O_RDWR) failed: Permission denied (13) in /home/www/postfixadmin/common.php on line 26
PHP message: PHP Warning: session_start(): open(/var/lib/php/session/sess_7p6c8kjkosj36d0lehjjr4eeg6, O_RDWR) failed: Permission denied (13) in /home/www/postfixadmin
/public/login.php on line 84" while reading response header from upstream, client: 192.168.1.1, server: tst-amo.net.ua, request: "GET /postfixadmin/public/login.php HT
TP/2.0", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "tst-amo.net.ua"
2018/08/18 08:55:06 [error] 1786#0: *9149 FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open(/var/lib/php/session/sess_7p6c8kjkosj36d0lehjjr4eeg6, O_RDW
R) failed: Permission denied (13) in Unknown on line 0

Лечим:

# chown -R nginx:www-data /var/lib/php/session

У меня выдавало ошибку на отсутствие директории templates_c:

# mkdir postfixadmin/templates_c
# chown nginx:www-data templates_c

Заходить в сетап:

https://tst-amo.net.ua/postfixadmin/public/setup.php

добавить

$CONF['setup_password'] = '422962da717c2abb5408efe.......b2fa22dd9f7d1bc01835c9e59a';

После настройки заходим и создаем домен, ящики и т.д.

https://tst-amo.net.ua/postfixadmin/public/login.php

3. Postfix – виртуальные пользователи

Создаем сначала групу vmail с идентификатором 1024:

# groupadd -g 1024 vmail

а потом добавляем туда пользователя:

# useradd -d /home/vmail -g 1024 -u 1024 vmail -m

Добавить в /etc/postfix/main.cf

 ........
 virtual_mailbox_base = /home/vmail
 virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
 virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
 virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
 virtual_minimum_uid = 1024
 virtual_uid_maps = static:1024
 virtual_gid_maps = static:1024

# Транспорт
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

…..

smtpd_recipient_restrictions =
    check_client_access hash:/etc/postfix/blacklist-IP
    permit_mynetworks
    permit_sasl_authenticated
    check_recipient_access hash:/etc/postfix/recipient-list
    reject_non_fqdn_recipient
    reject_unauth_destination
    reject_unknown_recipient_domain
    reject_unverified_recipient
    permit

Здесь правило reject_unauth_destination – должно запрещать открытый релей через ваш сервер

Содержимое служебных файлов:

[root@tst postfix]# cat mysql_virtual_alias_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
[root@tst postfix]# cat mysql_virtual_domains_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'
[root@tst postfix]# cat mysql_virtual_mailbox_maps.cf
user = postfix
password = mypassword
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
[root@tst postfix]# cat access_sender
tst-amo.net.ua OnlyFromMyUsers
[root@tst postfix]# cat blacklist
#spam@net.ua REJECT
#info@uni.ka REJECT Your e-mail was banned!
#acc@tst1.pp.ua REJECT Your e-mail was banned!
#s@i.ua REJECT SPAM!!!
/.*@tst-amo\.net\.ua/i REJECT You are not imp.kiev.ua, this is my name!!!

advocatov.com REJECT SPAM!!!
bilabonges.eu REJECT SPAM!!!
cloudlite.eu REJECT SPAM!!!
deals@save.spirit-airlines.com REJECT SPAM!!!
domrike.eu REJECT SPAM!!!
saffiano-double.ru REJECT SPAM!!!
whilsacom.eu REJECT SPAM!!!
[root@tst postfix]# cat blacklist-IP
1.52.38.29 REJECT Your IP is spam
2.90.145.125 REJECT Your IP is spam
5.235.7.171 REJECT Your IP is spam
37.104.210.18 REJECT Your IP is spam
37.106.204.58 REJECT Your IP is spam
42.113.159.236 REJECT Your IP is spam
42.116.220.21 REJECT Your IP is spam
43.250.80.131 REJECT Your IP is spam
45.244.118.151 REJECT Your IP is spam
[root@tst postfix]# cat header_checks
# Для спама
/^X-Spam-Level:.*\*{12,}.*/ REDIRECT spam@uni.ka
# Для вложений
/^(.*)name=\"(.*)\.(exe|bat|cmd|mp3)\"$/ REJECT Attachment type not allowed. File "$2" has unacceptable extension: "$3"
[root@tst postfix]# cat hello_access
mail.tst-amo.net.ua REJECT Don't use my server name!!!
[root@tst postfix]# cat recipient-list
# For these users to receive all
/^postmaster\@/ OK
/^hostmaster\@/ OK
/^abuse\@/ OK
/^webmaster\@/ OK
## Users
#/^mfint\@/ OK
#/^metall\@/ OK
[root@tst postfix]# cat whitelist
#--------------- Nuzhno_IMP -----------------
.nas.gov OK
@nas.gov OK
.domen.kiev.ua OK
@domen.kiev.ua OK

#--------------- Cheff other
@mpiyt-shalle.4mpg.de OK
.mpiyt-shalle.4mpg.de OK

 

4. Amavisd-new, ClamAV

This will install amavisd-new and a bunch of dependencies, and clamav + freshclam. It will also install SpamAssassin by default.

# yum install amavisd-new clamav clamav-update freshclam

Edit amavisd.conf.

# vim /etc/amavisd/amavisd.conf

Change the following lines like this…

$mydomain = ‘domain.com’; # a convenient default for other settings
$myhostname = 'mail.domain.com’; # must be a fully-qualified domain name and same as reverse DNS lookup

Make sure everything is set in postfix’s configuration file master.cf

# vim /etc/postfix/master.cf

On top of master.cf, you should have something like…

smtp inet n - n - - smtpd
  -o smtpd_sasl_auth_enable=yes
  -o receive_override_options=no_address_mappings
  -o content_filter=smtp-amavis:127.0.0.1:10024
 …and on bottom, you should have something like…
#
 # spam/virus section
 #
 smtp-amavis unix - - n - 2 smtp
   -o smtp_data_done_timeout=1200
   -o disable_dns_lookups=yes
   -o smtp_send_xforward_command=yes
 127.0.0.1:10025 inet n - y - - smtpd
   -o content_filter=
   -o smtpd_helo_restrictions=
   -o smtpd_sender_restrictions=
   -o smtpd_recipient_restrictions=permit_mynetworks,reject
   -o mynetworks=127.0.0.0/8
   -o smtpd_error_sleep_time=0
   -o smtpd_soft_error_limit=1001
   -o smtpd_hard_error_limit=1000
   -o receive_override_options=no_header_body_checks
   -o smtpd_helo_required=no
   -o smtpd_client_restrictions=
   -o smtpd_restriction_classes=
   -o disable_vrfy_command=no
   -o strict_rfc821_envelopes=yes

Stop the postfix daemon.

# service postfix stop

Start Spamassassin, Amavisd-new and ClamAV daemons.

Проверка синтаксиса Spamassassin

Обновляем правила Spamassassin:

# sa-update --nogpg

Обновляем базы Spamassassin

# service spamassassin start
# service amavisd start 
# service postfix start

5. Postgrey

# yum install postgrey
smtpd_recipient_restrictions =
   check_client_access hash:/etc/postfix/blacklist-IP
   permit_mynetworks
   permit_sasl_authenticated
   check_recipient_access hash:/etc/postfix/recipient-list
   reject_non_fqdn_recipient
   reject_unauth_destination
 ## POSTGREY
   #check_policy_service unix:/var/spool/postfix/postgrey/socket
   check_policy_service inet:127.0.0.1:10023
 ##
   reject_unknown_recipient_domain
   reject_unverified_recipient
   permit

строчка “check_policy_service unix:/var/spool/postfix/postgrey/socket,” или “check_policy_service inet:127.0.0.1:10023” должна быть обязательно прописана после строчки параметра “reject_unauth_destination”, как на примере выше.

По ману запускать нужно так:

# man postgrey
# postgrey --inet=10023 -d

# systemctl start postgrey && systemctl enable postgrey
# systemctl reload postfix

6. OpenDKIM

# yum install -y opendkim

Генерируем ключ:

# opendkim-genkey -D /etc/opendkim/ --domain tst-amo.net.ua --selector relay
# cd /etc/opendkim
# chown :opendkim /etc/opendkim/*
# chmod g+r /etc/opendkim/*
# cp opendkim.conf opendkim.conf_orig
# cat opendkim.conf_orig | grep "^[^#]" > opendkim.conf

Правим opendkim.conf до состояния:

[root@tst etc]# cat opendkim.conf
AutoRestart Yes
AutoRestartRate 10/1h
Umask 002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket inet:12301@localhost

Создаем служебные файлы:

# touch /etc/opendkim/TrustedHosts
# touch /etc/opendkim/KeyTable
# touch /etc/opendkim/SigningTable

Их содержимое:

# cat /etc/opendkim/KeyTable
 relay._domainkey.tst-amo.net.ua tst-amo.net.ua:relay:/etc/opendkim/relay.private
# cat /etc/opendkim/SigningTable
 *@tst-amo.net.ua relay._domainkey.tst-amo.net.ua
# cat /etc/opendkim/TrustedHosts
 127.0.0.1
 localhost
 *.tst-amo.net.ua
 #host.example.com
 #192.168.1.0/24

Запускаем сервис:

# systemctl start opendkim.service
# systemctl enable opendkim.service
# systemctl status opendkim.service

Добавляем в main.cf для Postfix

# nano /etc/postfix/main.cf
# DKIM
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:12301
non_smtpd_milters = $smtpd_milters

# service postfix reload

для BIND

# nano /var/named/chroot/var/named/tst-amo.net.ua.zone
 relay._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA......k02pIg+TwIDAQAB" )
# service named-chroot reload
# service named-chroot status

Проверяем.

7 . Dovecot

# yum install dovecot dovecot-mysql dovecot-pigeonhole

Dovecot quota

# nano /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota
# nano /etc/dovecot/conf.d/20-imap.conf
protocol imap {
   mail_plugins = $mail_plugins imap_quota
}
# nano /etc/dovecot/conf.d/10-master.conf
service dict {
    unix_listener dict {
       mode = 0660
       user = vmail
       group = vmail
    }
}
# nano /etc/dovecot/conf.d/90-quota.conf
plugin {
    quota = dict:User quota::proxy::quota
}
# nano /etc/dovecot/dovecot.conf
dict {
    quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
# nano /etc/dovecot/dovecot-dict-sql.conf.ext
connect = host=localhost dbname=postfix user=postfix password=mypassword
map {
    pattern = priv/quota/storage
    table = quota2
    username_field = username
    value_field = bytes
}
map {
    pattern = priv/quota/messages
    table = quota2
    username_field = username
    value_field = messages
}
map {
    pattern = shared/expire/$user/$mailbox
    table = expires
    value_field = expire_stamp
fields {
    username = $user
    mailbox = $mailbox
   }
}
# nano /etc/dovecot/dovecot-sql.conf.ext
# Database driver: mysql, pgsql, sqlite
 driver = mysql
 connect = host=localhost dbname=postfix user=postfix password=mypassword
 default_pass_scheme = MD5-CRYPT

#
 password_query = SELECT `username` as `user`, `password` FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

#
 user_query = SELECT CONCAT('/var/vmail/', `maildir`) AS \
 `home`, 1024 AS `uid`, 1024 AS `gid`, concat('dict:storage=', \
 CAST(ROUND(quota / 1024) AS CHAR), '::proxy::sqlquota') \
 AS quota, CONCAT('*:storage=', CAST(quota AS CHAR), 'B') AS quota_rule \
 FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

# Query to get a list of all usernames.
 iterate_query = SELECT username AS user FROM mailbox
# systemctl restart dovecot

Просмотр квоты пользователя(также можно просмотреть в WEB-интерфейсе PostfixAdmin).

# doveadm quota get -u username@example.com

Включение оповещений при превышении квоты

# nano /etc/dovecot/conf.d/90-quota.conf
plugin {
 # LDA/LMTP allows saving the last mail to bring user from under quota to
 # over quota, if the quota doesn't grow too high. Default is to allow as
 # long as quota will stay under 10% above the limit. Also allowed e.g. 10M.
   quota_rule = *:storage=500M
   quota_rule2 = Trash:storage=+100M
   quota_rule3 = Junk:ignore
   quota_grace = 10%%
}

dict {
   sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
 }

##
## Quota backends
##

# Multiple backends are supported:
# dirsize: Find and sum all the files found from mail directory.
# Extremely SLOW with Maildir. It'll eat your CPU and disk I/O.
# dict: Keep quota stored in dictionary (eg. SQL)
# maildir: Maildir++ quota
# fs: Read-only support for filesystem quota

plugin {
   #quota = dirsize:User quota
   quota = maildir:User quota::proxy::quota

   #quota = dict:User quota::proxy::quota
   #quota = fs:User quota
}

# Multiple quota roots are also possible, for example this gives each user
# their own 100MB quota and one shared 1GB quota within the domain:
plugin {
   #quota = dict:user::proxy::quota
   #quota2 = dict:domain:%d:proxy::quota_domain
   #quota_rule = *:storage=102400
   #quota2_rule = *:storage=1048576
}
# nano /etc/dovecot/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@tst-amo.net.ua
Subject: quota warning
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
To: $USER

Внимание!
Ваш ящик заполнен на $PERCENT%.

Attention!
Your mailbox is now $PERCENT% full.
EOF

 

image_pdfimage_print

Cron – отключить уведомления на почту

Cron job prevent the sending of errors and output

To prevent the sending of errors and output, add any one of the following at the end of the line for each cron job to redirect output to /dev/null.

>/dev/null 2>&1

OR

> /dev/null

OR

> /dev/null 2>&1 || true

Cron job example

Edit/Open your cron jobs, enter:

$ crontab -e

Append string >/dev/null 2>&1 to stop mail alert:

0 1 5 10 * /path/to/script.sh >/dev/null 2>&1

OR

0 1 5 10 * /path/to/script.sh > /dev/null

OR

0 * * * * /path/to/command arg1 > /dev/null 2>&1 || true

Save and close the file.

Set MAILTO variable

You can set MAILTO=”” variable at the start of your crontab file. This will also disable email alert. Edit/Open your cron jobs:

$ crontab -e

At the top of the file, enter:

MAILTO=""

Save and close the file.

https://www.cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command/

image_pdfimage_print

Windows – не загружается рабочий стол и меню пуск

Обычно, что бы не возиться с реестром, использую эти два варианта.

Первый (быстрый, временный) вариант.

Ctrl Alt Del –> Диспетчер задач –> Новая Задача –> explorer.exe –> Выполнить

Загрузиться меню пуск и Ваш рабочий стол. Теперь можно работать – до перезагрузки.

Второй вариант.

Скачайте программу AVZ и запустите ее. Нажмите «Файл» – «Восстановление системы». Выберите «5. Восстановление настроек рабочего стола», «9. Удаление отладчиков системных процессов», «16. Восстановление ключа запуска Explorer» и нажмите «Выполнить отмеченные операции». Перезагрузите компьютер.

В любом из вариантов очень желательна проверка на вирусы.

image_pdfimage_print

smartmontools

Пакет smartmontools состоит из двух утилит (smartctl и smartd), которые контролируют и следят за системными накопителями используя самопроверку, анализ и систему технологического отчёта (S.M.A.R.T.), встроенную в большинство современных ATA и SCSI жёстких дисков. Этот пакет основан на коде пакета smartsuite и включает поддержку ATA/ATAPI-5 дисков.

$ sudo yum install smartmontools
$ sudo nano /etc/smartmontools/smartd.conf
#DEVICESCAN -H -m root -M exec /usr/libexec/smartmontools/smartdnotify -n standby,10,q
/dev/sda -a -I 194 -W 4,45,55 -R 5 -H -l error -l selftest -m admin@example.com -o on -S on -s (S/../.././02|L/../../6/03)
[root@ring]# systemctl start smartd
[root@ring]# systemctl enable smartd

Настраиваем логирование в отдельный файл:

# vim /etc/rsyslog.d/smartd.conf

if ( $programname startswith "smartd" ) then {
action(type="omfile" file="/var/log/smartd.log")
stop
}

Перезагружаем сервисы:

# systemctl restart {rsyslog,smartd}
# systemctl status {rsyslog,smartd}

Подробнее:

https://www.opennet.ru/base/sys/smart_hdd_mon.txt.html

Критические параметры SMART

image_pdfimage_print

arpwatch

arpwatch — демон, который отслеживает соответствие между IP и MAC-адресами, и при обнаружении аномалий, сообщающий об этом в Syslog. Используется как один из инструментов для борьбы с ARP-spoofing’ом.

Демон анализирует ARP-ответы на сетевом интерфейсе, к которому он привязан, и запоминает соответствие IP-адресов и MAC-адресов. Как только он видит, что соответствие нарушено, или обнаруживает появление новых адресов в сети, он сообщает об этом в системный журнал (syslog).

# yum install arpwatch

Конфигурируем:

$ cat /etc/sysconfig/arpwatch
OPTIONS="-i enp5s0 -f arp.dat -u arpwatch -e admin@example.com -s 'root (Arpwatch)'"
$ sudo systemctl start arpwatch
$ sudo systemctl enable arpwatch
/var/lib/arpwatch - default directory
          arp.dat - ethernet/ip address database
   ethercodes.dat - vendor ethernet block list

По умолчанию, демон пишет логи в /var/log/messages, что бы не мусорить в этот файл перенаправим в отдельный лог. Для этого создаем файл логов и файл конфигурации для rsyslog

# touch /var/log/arpwatch.log

# vi /etc/rsyslog.d/arpwatch.conf
if ( $programname startswith "arpwatch" ) then {
action(type="omfile" file="/var/log/arpwatch.log")
stop
}

Проверяем и перезапускаем:

# rsyslogd -N 1
# systemctl restart rsyslog

Так как в первых трех октетах МАС-адреса кодируется производитель оборудования, нам желательно иметь обновленную локальную базу МАС/Производитель. Обновляем базу MAC адресов:

# vi arpwatch_update_mac.sh

#!/bin/bash
# update_mac_addresses.sh
# This script downloads the currect mac address data from the IEEE and parses it for nmap and arpwatch.
# nmap-mac-prefixes is for nmap.
# ethercodes.dat is arpwatch.

# Download the current data

wget http://standards-oui.ieee.org/oui/oui.txt

# Divide the data into Manufacturer and Address files
cat oui.txt | grep '(base 16)' | cut -f3 > mac.manufacturer
cat oui.txt | grep '(base 16)' | cut -f1 -d' ' > mac.address

# Paste them back together for nmap data
paste mac.address mac.manufacturer > nmap-mac-prefixes

# Parse the address data for arpwatch
cat mac.address | perl -pe 's/^(([^0].)|0(.))(([^0].)|0(.))(([^0].)|0(.))/\2\3:\5\6:\8\9/' > tmp.address
cat tmp.address | tr [A-Z] [a-z] > mac.address

# Paste the parsed data into the arpwatch file
paste mac.address mac.manufacturer > /var/lib/arpwatch/ethercodes.dat

# Clean up intermediary files
rm tmp.address
rm mac.address
rm mac.manufacturer
rm oui.txt

Делаем файл исполняемым и прописываем в cron для ежемесячного обновления:

# chmod +x arpwatch_update_mac.sh
# crontab -e
@monthly                /home/svm/bin/arpwatch_update_mac.sh

ARPWatch рассылает четыре вида сообщений.

  • new activity – связка ethernet/ip-адресов снова проявила активность спустя шесть месяцев или больше
  • new station – ethernet-адрес зафиксирован впервые
  • flip flop – ethernet-адрес изменился с одного известного адреса на другой известный адрес
  • changed ethernet address – хост перешёл на использование нового ethernet-адреса

ARPWatch также пишет события в messages/syslog.

В syslog могут писаться следующие типы уведомлений:

  • ethernet broadcast  – MAC-адрес хоста является широковещательным.
  • ip broadcast – IP-адрес хоста является широковещательным.
  • bogon – адрес отправителя IP-пакета не входит в непосредственно подключённую сеть (directly connected network) для заданного интерфейса.
  • ethernet broadcast – MAC-адрес отправителя состоит из одних нулей или одних единиц.
  • ethernet mismatch – MAC-адрес отправителя пакета не соответствует MAC-адресу, указанному внутри ARP-запроса.
  • reused old ethernet address – ethernet-адрес изменился с известного адреса на адрес, который был замечен ранее, но не только что. (Похоже на flip flop, но чуть-чуть другое.)
  • suppressed DECnet flip flop – сообщение “flip flop” подавлено в связи с тем, что как минимум один из двух адресов является адресом DECnet.

Если в логах появляются сообщения вида

Aug 2 06:52:09 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:10 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:35 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:36 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71
Aug 2 06:52:37 ring arpwatch: bogon 10.90.90.91 1c:af:f7:e1:b6:71

где 10.90.90.91 – IP  из другой сети, отличной от той, что сконфигурирована на слушающимся интерфейсе (например, для доступа к комуникатору), то можно добавить эту сеть в настройках /etc/sysconfig/arpwatch, что бы не мусорило в логах и перегрузить сервис:

-n 10.90.90.0/24

Источники:

image_pdfimage_print

openvpn

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

# yum -y install epel-release
# yum -y install openvpn

Доустановим утилиты:

# yum install wget unzip zip

устанавливаем утилиту Easy-RSA:

# cd /etc/openvpn/keys
# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
# unzip master.zip
# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3

Создаем структуру публичных PKI ключей:

# mv vars.example vars
# ./easyrsa init-pki

Создайте удостоверяющий центр CA:

# ./easyrsa build-ca

Не забудьте указанный пароль. Его нужно будет вводить каждый раз при создании нового сертификата openvpn.

Мы получили 2 ключа:

/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/ca.key
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/ca.crt

Первый ключ секретный, его нужно оставить на сервере и никому не отдавать. Второй — открытый, его мы будем вместе с пользовательскими сертификатами передавать клиентам.

Создаем запрос сертификата для сервера без пароля с помощью опции nopass, иначе придется вводить пароль с консоли при каждом запуске сервера:

# ./easyrsa gen-req server nopass

Подписываем запрос на получение сертификата у нашего CA:

# ./easyrsa sign-req server server

В процессе работы скрипта вводим пароль от CA, который указывали раньше и отвечаем на вопрос yes. Мы получили подписанный удостоверяющим центром сертификат для сервера — /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/server.crt

Нам еще пригодится ключ Диффи-Хелмана, генерируем его:

# ./easyrsa gen-dh

По завершению работы скрипта получаем файл dh сертификата — /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/dh.pem.

Копируем в папку /etc/openvpn все необходимые для работы openvpn сервера ключи:

# cp pki/ca.crt /etc/openvpn/ca.crt
# cp pki/dh.pem /etc/openvpn/dh.pem
# cp pki/issued/server.crt /etc/openvpn/server.crt
# cp pki/private/server.key /etc/openvpn/server.key

Создадим ключ для клиента openvpn (nopass – без пароля, но лучше с паролем):

# ./easyrsa gen-req user1 nopass
# ./easyrsa sign-req client user1

Процедура аналогична созданию сертификата для сервера. Так же вводим пароль (pass-фразу сервера), отвечаем yes. В результате получаем подписанный сертификат клиента:

/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/user1.crt
/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/user1.key

Создание статического ключа HMAC

Для создания ключа HMAC используйте команду openvpn с опциями –genkey и –secret:

# cd /etc/openvpn
# openvpn --genkey --secret ta.key

Клиенту, которым у нас является шлюз филиала нужно будет передать следующий набор файлов — user1.crt, user1.key, ca.crt, ta.key.

Теперь приступаем к настройке. Создаем файл конфигурации openvpn:

# nano /etc/openvpn/server.conf
port 1194 # я предпочитаю использовать нестандартные порты для работы
proto udp # протокол может быт и tcp, если есть необходимость в этом
dev tun

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem

# Проверка, не отозван ли сертификат клиента
crl-verify /etc/openvpn/crl.pem

# Включаем TLS
tls-auth /etc/openvpn/ta.key 0
tls-server
tls-timeout 120
auth SHA512
cipher AES-256-CBC
#auth MD5
#cipher BF-CBC

server 10.8.0.0 255.255.255.0 # подсеть для туннеля, может быть любой
route 10.8.0.0 255.255.255.252 # указываем подсеть, к которой будем обращаться через vpn rab
push "route 192.168.113.0 255.255.255.0" # передаем маршрут клиентам

# Для доступа клиентов через удаленный шлюз в Internet
# Если не нужен - закоментировать
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"

ifconfig-pool-persist ipp.txt # файл с записями соответствий clinet - ip
client-to-client # позволяет клиентам openvpn подключаться друг к другу
client-config-dir /etc/openvpn/ccd # директория с индивидуальными настройками клиентов

keepalive 10 120

# сжатие трафика
comp-lzo
persist-key
persist-tun

max-clients 100
user nobody
group nobody

status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 4
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose

Создаем необходимые директории:

# mkdir /etc/openvpn/ccd && mkdir /var/log/openvpn

Создаем файл конфигурации клиента в папке, указанной в параметре client-config-dir :

# nano /etc/openvpn/ccd/user1
iroute 192.168.113.0 255.255.255.0

Здесь user1 — имя сертификата пользователя.

Если вам нужно объединить две разные локальные сети в одну условно общую, но с разной адресацией, то вам нужен tun. То есть в нашем случае мы объединяем две сети 192.168.1.0/24 и 192.168.60.0/24 для взаимного совместного доступа.

Если же у вас стоит задача объединить 2 удаленные сети в единое адресное пространство, например сделать и в офисе и в филиале единую сеть 192.168.10.0/24, то тогда бы мы использовали tap интерфейс и указывали бы на компьютерах в обоих сетях не пересекающиеся адреса из одной подсети. В таком состоянии openvpn работает в режиме моста.

Запускаем сервер:

# systemctl start openvpn@server
# systemctl enable openvpn@server
# netstat -tulnp | grep 1194
udp 0 0 0.0.0.0:1194 0.0.0.0:* 17719/openvpn
# ip a
 tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
 link/none
 inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
    valid_lft forever preferred_lft forever

Статический маршрут:

# netstat -rn
Kernel IP routing table
Destination    Gateway         Genmask         Flags MSS Window irtt Iface
0.0.0.0        22.44.19.162    0.0.0.0         UG      0 0         0 enp4s0
10.8.0.0       10.8.0.2        255.255.255.252 UG      0 0         0 tun0
10.8.0.0       10.8.0.2        255.255.255.0   UG      0 0         0 tun0
10.8.0.2       0.0.0.0         255.255.255.255 UH      0 0         0 tun0
192.168.113.0  0.0.0.0         255.255.255.0   U       0 0         0 enp5s0
22.44.19.160   0.0.0.0         255.255.255.240 U       0 0         0 enp4s0

Траффик из подсети 10.8.0.0/24 будет маршрутизироваться в тоннель.

Клиентские ключи

Создадим ключ для клиента openvpn:

# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
# ./easyrsa gen-req user1 nopass
# ./easyrsa sign-req client user1

Опять можно отметить, что могут быть ситуации, когда лучше ключ клиента защищать паролем, хотя бы несложным. Тогда всякий раз при подключении к VPN необходимо будет ввести пароль. Это может быть удобным, если вы не хотите, например, чтобы ваш ребенок случайно подключился к вашей рабочей сети и натворил делов. Для этого просто не надо указывать “nopass” в конце команды выше.

В итоге мы получим два файла:

Публичный сертификат клиента:

/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/user1.crt

Приватный ключ клиента:

/etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/user1.key

Клиенту вместе с конфигом (см ниже) нужно будет передать копии следующих файлов:

user1.crt;
user1.key;
ca.crt;
ta.key;

которые все используются в клиентском конфиге. Никакие иные файлы, кроме тех, которые указаны в конфиге клиента, передавать клиенту не надо!

Дальше создаем файл конфигурации для этого клиента:

# cd /etc/openvpn/ccd
# nano user1
push "route 192.168.113.0 255.255.255.0"
#push "route 192.168.50.0 255.255.255.0"

Этими параметрами мы передаем клиенту маршруты к обоим сетям офисов. Если нужно подключать клиента только к какой-то одной сети, то оставляйте одну сеть, вторую удаляйте.

IPTABLES

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# OPENVPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i enp5s0 -o tun+ -j ACCEPT
iptables -A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

iptables -A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT
.....
# NAT 
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp4s0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.113.0/24 -o enp4s0 -j MASQUERADE
....
# OPENVPN
iptables -A INPUT -i enp4s0 -p udp --dport 1194 -j ACCEPT
....
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Настройка Windows клиента

Теперь нужно скачать openvpn client под нашу версию windows, запускать установщик нужно обязательно с правами администратора.

cat client.ovpn
dev tun
proto udp
remote 194.44.219.161
port 1194
client
resolv-retry infinite
ca ca.crt
cert user1.crt
key user1.key
remote-cert-eku "TLS Web Server Authentication"
remote-cert-tls server
tls-client
tls-auth ta.key 1
auth SHA512
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
mute-replay-warnings
verb 3

Сохраняем конфигурацию под именем client.ovpn в папку C:\Program Files\OpenVPN\config, туда же копируем файлы сертификатов и запускаем OpenVPN GUI от имени администратора!

Правой мышкой в трее – подключиться. Теперь при подключении нам доступны ресурсы сети 192.168.113.0/24 и интернет. При заходе на страничку, например, 2ip.ru – сайт покажет IP рабочего сервера.

Создание списка отзывов сертификатов

Если сотрудник уволился, необходимо заблокировать его доступ в сеть VPN компании. Специально для этой цели в OpenVPN предусмотрен список отзыва сертификатов CRL. Создайте его такой командой:

# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
# ./easyrsa gen-crl

У вас будет запрошен пароль доступа к приватному ключу ca.key удостоверяющего центра. Список отзыва сертификатов будет создан в файле /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem.

Если нужно заблокировать выданный ранее сертификат, воспользуйтесь следующей командой:

# ./easyrsa revoke user1

Здесь мы отозвали сертификат для клиента user1. Далее нужно скопировать новый файл CRL на сервер OpenVPN и перезапустить демон OpenVPN.

Обновление списка отзывов сетрификатов

По умолчанию,  продолжительность жизни списка отзывов сертификатов crl.pem равна 180 дням, за это отвечает переменная:

# cat /etc/openvpn/keys/easy-rsa-master/easyrsa3/vars

#set_var EASYRSA_CRL_DAYS 180

Поэтому, по истечению срока указанного в vars, нужно будет обновить список (понадобится парольная фраза для доступа к приватному ключу ca.key удостоверяющего центра):

# cd /etc/openvpn/keys/easy-rsa-master/easyrsa3/
# ./easyrsa gen-crl
# cp ./pki/crl.pem /etc/openvpn/crl.pem
# systemctl restart openvpn@server

Клиент для Linux (Mint)

Выбираем VPN Connection и заполняем настройки:

 

 

Терминология

Файлы для сервера OpenVPN.

Файл Описание
dh.pem Файл Диффи-Хелмана для защиты трафика от расшифровки
ca.crt Сертификат удостоверяющего центра CA
server.crt Сертификат сервера OpenVPN
server.key Приватный ключ сервера OpenVPN, секретный
crl.pem Список отзыва сертификатов CRL
ta.key Ключ HMAC для дополнительной защиты от DoS-атак и флуда

Настроить openvpn на CentOS 7
https://bozza.ru/art-269.html
https://1cloud.ru/help/linux/openvpnserver_debian7_ubuntu12
Руководство по установке и настройке OpenVPN

 

image_pdfimage_print