OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.

Категории: HowTo

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

Для этого нужно три компонента:

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

Корневой сертификат и сертификат сервера

Создаем корневой центр собственной сертификации (лучше делать это не на той машине, где запуен openvpn и там должен быть установлен пакет easy-rsa)

$ cp -R /usr/share/easy-rsa/3.0.0/ ~/CA  
$ cp /usr/share/doc/easy-rsa/vars.example ~/CA/vars  
$ cd ~/CA

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

Инициализировать PKI (Public Key Infrastructure — Инфраструктура открытых ключей):

$ ./easyrsa init-pki

Создать корневой сертификат. Common Name сервера вводить на ваше успотрение. (лучше придумать что-то вроде vpn-server). Сложный пароль ключа обязателе. Не менее 128 бит.

$ ./easyrsa build-ca

Создать ключи Диффи-Хелмана

$ ./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass), иначе при каждом старте OpenVPN будет запрашивать этот пароль.

$ ./easyrsa gen-req vpn-server nopass

Создать и подписать сертификат

$ ./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn

$ sudo mkdir -p /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/ca.crt /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/issued/vpn-server.crt /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/private/vpn-server.key /etc/openvpn/keys  
$ sudo mkdir cp ~/CA/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта.

$ cd /etc/openvpn/keys/  
$ sudo openvpn --genkey --secret ta.key

Генерация пользовательских ключей

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User

$ cd ~/CA  
$ ./easyrsa gen-req User

User - это имя пользователя для которого вы генерируете ключ.

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

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

$ ./easyrsa gen-req User nopass

Теперь ключ надо подписать

$ ./easyrsa sign-req client User

Дефолтно ключ выдается на 10 лет. Можно ограничить время. И ключи придется только перевыпускать по завершению работы.

$./easyrsa sign-req client User -days 90

Клиенту потребуется следующий набор файлов

 ~/CA/pki/issued/User.crt  
 ~/CA/pki/private/User.key  
 ~/CA/pki/ca.crt  
 /etc/openvpn/keys/ta.key

Отзывы сертификатов

Герируем файл отозванных ключей

$ cd ~/CA  
$ ./easyrsa gen-crl

Если вы все же сделали центр сертификации на той же машине, на которой у вас сервер, то можете слинковать файл отозванных ключей. Но лучше скопировать. И эту операцию нужно повторять каждый раз при отзыве ключей.

$ sudo cp ~/CA/pki/crl.pem /etc/openvpn/keys

В /etc/openvpn/server.conf добавить строку

crl-verify /etc/openvpn/keys/crl.pem

Отзыв сертификата пользователя User

$ ./easyrsa revoke User

Каждый раз при отзыве сертификата необходимо обновлять crl.pem, чтобы внести в него изменения

$ ./easyrsa gen-crl

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

failed to update database  
Easy-RSA error:  
signing failed (openssl output above may have more detail)

Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента как показано ниже служит параметр remote-cert-tls server в конфиге клиента.

WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

Ссылки:

OpenVPN: Настройка на собственном сервере. Часть 0 - подготовка системы.

Категории: HowTo

В этих туториалах я опишу как поднять собственный openvpn на vds/vps.

В качестве базовой системы рассматривается Fedora/RedHat/CentOS. Для других систем шаги будут несколько отличаться.

Для начала нам нужно подготовить сервер: поставить необходимые пакеты.

Управлять доступом мы будем через iptables, а не firewalld. Так же если ваш сервер не использует ipv6, то ip6tables вам не нужен.

Важно: ни в коем случае не отключайтесь от сервера до оконччания настройки iptables. Иначе доступ к серверу будет потерян.

$ sudo dnf install iptables-services openvpn easy-rsa  
$ sudo systemctl mask firewalld  
$ sudo systemctl enable iptables  
$ sudo systemctl enable ip6tables  
$ sudo systemctl restart iptables  
$ sudo systemctl restart ip6tables

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

Вообще правила iptables изначально поставляются с возможностью доступа по ssh.

Для проверки можно заглянуть в /etc/sysconfig/iptables (и /etc/sysconfig/ip6tables для ipv6). Там будет строчка вроде

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Если она там есть, то проверьте с другого терминала, что доступ к ssh возможен.

Так же, если сервис висит на нестандартном порту, то стоит изменить номер порта в этих файлах.

Если же доступа к ssh нет, то нужно добавить его вручную

$ sudo iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

и сохранить правила.

$ sudo /usr/libexec/iptables/iptables.init save

Дальше перезагружаем таблицы еще раз

$ sudo systemctl restart iptables  
$ sudo systemctl restart ip6tables

Проверяем с другого терминала тот факт, что доступ к ссх не пропал (или наоборот появился) и на этом предварительная настройка окончена.

XMonad, Qt и LibreOffice - проблемы рендеринга приложений

xmonad-qt_without_icons_in_console Многие пользователи сталкиваются с тем, что за пределами kde или гнома у приложений qt пропадают иконки. Но это не единственная проблема.

Вторая проблема - это странное поведение приложений из пакета libreoffice - при каждом щелчке мышью в окне или вводе текста окно полностью перерисовывается. И это заметно даже невооруженным глазом. И очень сильно мешает работать.

xmonad-qt_without_icons

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

Самый простой способ решить проблему - указать, из какого окружения нужно брать настройки - выставить переменную окружения XDG_CURRENT_DESKTOP в значение KDE или GNOME (а может быть XFCE - такое значение тоже возможно). Все зависит от того, каким de должен прикидываться ваш wm :)

Сходу мне не попалась спецификация по этой переменной окружения. Поэтому ссылок не вставляют.

Для своей конфигурации xmonad я прописал в .xinitrc

export XDG_CURRENT_DESKTOP=KDE

И все нормально работает. В приложениях qt появились значки, а libreoffice пропали лаги отрисовки.

xmonad-qt_without_icons_with_fix

Linux: связываем приложение с типами файлов

Статья дополнена 2022-03-08

xdgНе секрет, что для новичков в никсах существует лишь один путь для выбора приложения, которым будет открываться какой-либо тип файлов: конфигуратор его рабочей среды (кеды, гном, xfce или иное).
Однако то, что происходит за кадром пользователю остается неизвесным. И как только юный падаван попадает в голые иксы с запущенным xterm или голым, но от этого не менее дружелюбным, оконным менеджером (openbox, fluxbox, xmonad и т.д.) - у него сразу возникает куча проблема.

  • почему все мои файловые ассоциации, которые я так долго настраивал исчезли?
  • Почему в mc все картинки и видео вдруг начинают открываться в браузере?
  • почему они вообще открываются через mc?
  • почему firefox при выборе пункта “открывать файл” вместо сохранить открываеть его непонятно где или вообще не открывает?

И новичок это гиблое дело забрасывает и возвращается в удобные кеды, гном или что-то еще.

Но на самом деле не все так страшно.

Современные стандарты freedesktop указывают нам на то, что запуск приложений осуществляется с помощью *.desktop файлов, которые описывают все, что необходимо для работы приложения.

А чтобы связать тип файла с приложением, которое будет запускаться введен стандарт Association between MIME types and applications.

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

Путь Предназначение
$HOME/.config/$desktop-mimeapps.list Пользовательские ассоциации. Специфичные для рабочего стола $desktop
$HOME/.config/mimeapps.list Пользовательские ассоциации (независимы от рабочего стола)
/etc/xdg/$desktop-mimeapps.list Глобальные ассоциации. Предоставляются администратором. специфичные для рабочего стола $desktop
/etc/xdg/mimeapps.list Глобальные ассоциации, предоставляемые админом и вендорами ПО.
$HOME/.local/share/applications/$desktop-mimeapps.list Глобальные системные ассоциации. Специфичны для рабочего стола $desktop. Запрещен к использованию. Будет удален в новых редакциях стандарта.
$HOME/.local/share/applications/mimeapps.list Глобальные системные ассоциации. Запрещен к использованию. Будет удален в новых редакциях стандарта.
/usr/local/share/applications/$desktop-mimeapps.list and  
/usr/share/applications/$desktop-mimeapps.list Набор ассоциаций, которые предоставляются мейнтейнерами дистрибутива. Специфичны для рабочего стола $desktop.
/usr/local/share/applications/mimeapps.list and  
/usr/share/applications/mimeapps.list Набор ассоциаций, которые предоставляются мейнтейнерами дистрибутива.

Таблица описывает файлы в том порядке, в котором они обрабатываются системой. Переменная $desktop представляет из себя имя рабочего стола в нижнем регистре (kde, gnome, xfce, …).

Данные файлы представляют из себя набор записей вида

[Default Applications]  
mimetype1=default1.desktop;default2.desktop

mimetype - описание формата. Что-то вроде audio/ogg. Стандарт описания mimetype можно глянуть в соответствующих RFC.
*.desktop есть файл запуска вашего приложения. Обрабатывается список файлов последовательно до первого встреченного существующего приложения. Либо система перейдет к обработке следующего файла.

Помимо основной секции стандарт оговаривает две дополнительных секции.

[Added Associations]  
mimetype1=foo1.desktop;foo2.desktop;foo3.desktop  
mimetype2=foo4.desktop  
[Removed Associations]  
mimetype1=foo5.desktop  

Секция “added associations” добавляет к выбранным mime-типам указанные приложения в начало списка. Секция “removed association” соотственно удаляет указанные приложения из ассоциации к выбранному mime-типу.

Все. с теорией покончено.

Как было сказано выше - в “дружелюбном окружении уже существует какая-нибудь утилита, которая позволяет пользователю изменить ассоциации.

Но гораздо проще делать это в консоли.

Существует инструмент под названием xdg, который как раз отвечает за работу со списками ассоциаций. И большинство приложений как раз используют его api дабы открывать файлы (mc, nautilus, firefox, …).

Попробуем сделать в консоли

$ xdg-open ~/some_path_to_image.jpg

Вы увидите, что картинка откроется при помощи стандартного вьювера для вашего рабочего стола.

А теперь попробуйте сделать

$ xdg-mime query default image/jpg

Вы увидите что-то вроде

eog.desktop;

xdg-mime - инструмент, который входит в комплект поставки любого дистрибутива. Им можно как просматривать, так и изменять ассоциации файлов.

Для примера узнаем, как система распознает какую-нибудь картинку.

% xdg-mime query filetype wallpaper.jpg

Увидим

image/jpeg

Shared MIME database

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

Для целей статьи это неинтересно, но почитать можно тут.

Как работает привязка файлов в ручном режиме

Посмотрим, что происходит под капотом. Сейчас это не самый лучший способ. О более простом варианте речь пойдет чуть дальше.

Допустим, что у нас свежезаведенный профиль.

$ cat ~/.local/share/applications/mimeapps.list  
[Default Applications]  

У вас этого файла может не быть, либо он может содержать какие-то дефолтные значения.

А теперь мы хотим, чтобы файлы mp4 открывались при помощи vlc.

$ xdg-mime default vlc.desktop video/mp4  
$ cat ~/.local/share/applications/mimeapps.list

[Default Applications]  
video/mp4=vlc.desktop

Как видим - используется vlc. И если мы попробуем сделать

$ xdg-open path_to_mp4_file.mp4

Файл откроется уже в vlc.

Автоматизированный способ привязки

Сначала нам нужно понять, какие приложения поддерживают нужный mime.

Каждый *.desktop-файл содержит записи mime-типов, которые он поддерживает.

$ cat /usr/share/applications/pcmanfm.desktop | grep -i mime
MimeType=inode/directory;

Теперь нам нужно лишь грепнуть все desktop чтобы найти, что нам надо.

Допустим, что нам хочется переопределить приложение для открытия папок. Найдем, кто их может открывать.

$ rgrep "inode/directory" /usr/share/applications
/usr/share/applications/mimeinfo.cache:inode/directory=org.gnome.baobab.desktop;pcmanfm.desktop;ranger.desktop;
/usr/share/applications/org.gnome.baobab.desktop:MimeType=inode/directory;
/usr/share/applications/mimeapps.list:inode/directory=org.gnome.Nautilus.desktop
/usr/share/applications/pcmanfm.desktop:MimeType=inode/directory;
/usr/share/applications/gnome-mimeapps.list:inode/directory=org.gnome.Nautilus.desktop
/usr/share/applications/ranger.desktop:MimeType=inode/directory;

Тут мы видим, что папками манипулируют ranger, baobab и pcmanfm.

Для привязки приложения и типа нам так же поможет xdg-mime.

xdg-mime default application mimetype(s)
$ xdg-mime default pcmanfm.desktop inode/directory

Тем самым мы связали тип inode/directory с приложением pcmanfm. Стоит заметить, что указывать путь до *.desktop не надо. Он будет разыскиваться по стандартным путям, которые мы обсудили выше.

Замечания

Искать кто может открыть какой-то файл долго и сложно. Можно воспользоваться утилитой lsdesktopf.

Литература:

PHP+Apache: глюк?

Категории: Разработка

Сегодня столкнулся с совершенно с чудовищным по своей странности багом.

Есть код. Простейший.

$a = array('' => 'value');

$key = '';  
$falseKey = false;  
$falseKey = (string)$falseKey; // $falseKey === '' будет true

var_dump(isset($a[$key]));  
var_dump(isset($a[$falseKey]));

Вы думаете, что в обоих случаях код выведет true?
А вот и нет.

Существуют какие-то глюки в связке модуля пхп и апача, которые приводят к тому, что во втором случае код выдаст false.

Это не вылечилось перезагрузкой апача. Вылечилось лишь его полной остановкой и запуском.

Любопытно, что данный баг воспроизвелся лишь на одном сервере. На других абсолютно идентичных он не воспроизводился.

UPD (13.12.2015):
Таки “автором” этого глюка выступило расширение xdebug. К сожалению детального разбора проблемы я не осуществлял. Просто если вы встретились с неверным пониманием языком типов переменных, то смотрите в сторону xdebug.