Архів рубрики: Linux

Це мабуть головна категорія сайту, тому що все на ньому з’являється так чи інакше пов’язане з цією операційною системою.

Створення власного SSL сертифікату та застосування його у Nginx

Стисло опишу, як згенерувати SSL сертифікат у Debian.

Встановлюємо пакет ssl-cert:

apt-get install ssl-cert

Створюємо сертифікат для потрібного домену:

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/ДОМЕН

Ця консольна утиліта запитає назву домену. Ви повинні ввести домен, для якого створюється сертифікат.

Сертифікат матиме вміст:

-----BEGIN RSA PRIVATE KEY-----
 це приватний ключ
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
 це публічний сертифікат
-----END CERTIFICATE-----

Приватний ключ зберігаємо у каталозі /etc/ssl/private. Краще дати йому розширення *.key:

$ cat /etc/ssl/private/ДОМЕН.key
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Публічну частину – у каталозі /etc/ssl/certs, з розширенням *.pem:

$ cat /etc/ssl/certs/ДОМЕН.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Оригінальній файл можна видалити. Чомусь в мене файл сертифікату був створений зі символічним посиланням на нього. Це посилання – теж видаляємо.

Підключаємо сертифікат до Nginx:

server {

 listen   443;
 server_name ДОМЕН;

 ssl  on;
 ssl_certificate        /etc/ssl/certs/ДОМЕН.pem;
 ssl_certificate_key    /etc/ssl/private/ДОМЕН.key;

 ssl_session_timeout  5m;

 ssl_protocols  SSLv3 TLSv1;
 ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
 ssl_prefer_server_ciphers   on;

 ...
}

Шифрований (https) доступ до wiki (http) за допомогою Nginx

До wiki сайту треба створити зашифрований SSL доступ. Wiki працює всередині віртуальної машини і не має можливості дати йому реального IP. Тому шифрування доступу будемо здійснювати засобами Nginx.

Схема буде такою:

Nginx (https) -> proxy_pass -> Apache (http) with Wiki

Генерація штучного SSL сертифікату доволі тривіальна задача, не будемо зупинятися на цьому.

Налагодження Nginx складається з 3-х частин:

  • переведення всього HTTP трафіку у HTTPs
  • проксування HTTPs з Nginx на Apache з wiki
  • зміна $wgServer у параметрах wiki

1. Перетворюємо HTTP запити у дзеркальні HTTPs

server {
    listen   80;
    server_name ДОМЕН;
    rewrite ^ https://$server_name$request_uri? permanent;
}

2. Проксуємо трафік до wiki

server {
    listen   443;
    server_name ДОМЕН;
    ssl  on;
    ...
    location / {
        proxy_pass       http://ЛОКАЛЬНА_АДРЕСА_WIKI:80;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect   off;
    }
}

3. Міняємо http на https у змінній $wgServer

Після перших 2-х кроків ми практично зробили шифроване з’єднання, але деякі посилання всередині wiki сторінок містять http протокол.

Треба відредагувати файл LocalSettings.php і замінити:

$wgServer = "http://ДОМЕН";

на

$wgServer = "https://ДОМЕН";

Видалення правил iptables за їх порядковим номером

Фільтр iptables досить ризикований інструмент, заплутаний проте дуже потужний.

Сьогодні дізнався як видалити одне правило з ланцюжка за його порядковим номером. Для цього достатньо додати параметер –line-numbers:

# iptables -nL -v --line-numbers -t nat
Chain PREROUTING (policy ACCEPT 1463 packets, 92569 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        2   120 DNAT       tcp  --  *      *       0.0.0.0/0            ...

Chain POSTROUTING (policy ACCEPT 323 packets, 27643 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    ...
2        1    76 MASQUERADE  udp  --  *      *       192.168.122.0/24    ...
3        0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    ...

Chain OUTPUT (policy ACCEPT 198 packets, 14282 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Стовпець num вказує порядковий номер. Мені потрібен перший запис у ланцюжку PREROUTING. Видаляю його командою:

# iptables -D PREROUTING 1 -t nat

mysqldump – кожен запис окремим рядком

Утиліта mysqldump при збереженні даних таблиць об’єднує усі записи у одну команду INSERT. Виглядає це приблизно так:

INSERT INTO `таблиця` VALUES (запис1),(запис2), ..., (останній запис);

Коли таблиця має багато записів, то команда INSERT перетворюється у довжелезний рядок. Це зручно для машини, але людині читати такий файл складно.

Одне з рішень – замість однієї команди INSERT використовувати окремі команди для кожного запису:

mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

Тоді файл матиме вигляд:

INSERT INTO `таблиця` (опис полів) VALUES (запис1);
INSERT INTO `таблиця` (опис полів) VALUES (запис2);
INSERT INTO `таблиця` (опис полів) VALUES (...);
INSERT INTO `таблиця` (опис полів) VALUES (останній запис);

Але є краще рішення. Для цього достатньо пропустити результат mysqldump –extended-insert крізь регулярний вираз у інтерпретаторі Perl:

mysqldump --extended-insert ... | perl  -pane "s{),(}{),n(}smg" > дамп_файл.sql

Після цього сприймати зміст дампу стає значно простіше:

INSERT INTO `таблиця` (опис полів) VALUES (запис1),
(запис2),
(запис3),
...,
(останній запис);

make: apxs: Command not found

Таке повідомлення з’являється при спробі компіляції старого модуля Apache. В інтернеті радять встановлювати пакет dev пакет апачу (в моєму випадку це apache2-prefork-dev). Але команди apxs в ньому не має.

Проте є /usr/bin/apxs2, тому ліземо у Makefile і міняємо:

APXS=apxs

на

APXS=apxs2

Встановлення модулів Perl в Debian

Коли мені потрібен якийсь модуль Perl, я спочатку перевіряю його наявність у пакунках – http://www.debian.org/distrib/packages#search_contents

Це дуже просто, достатньо знати якого файлу не вистачає. Наприклад, ми отримали таке повідомлення про помилку:

Can't locate LWP/UserAgent.pm in @INC ...

Воно означає, що потрібен модуль LWP::UserAgent, але насправді це файл UserAgent.pm у каталозі LWP. Тому шукаємо саме так, як вказано у повідомленні про помилку: LWP/UserAgent.pm (режим “paths ending with the keyword”).

Пошук повертає 3 пакунки:

/usr/share/perl/5.10.1/CPAN/LWP/UserAgent.pm perl-modules
/usr/share/perl5/LWP/UserAgent.pm libwww-perl
/usr/share/perl5/Test/Mock/LWP/UserAgent.pm libtest-mock-lwp-perl

Нам потрібен libwww-perl, бо пакунок, що у назві містить test призначений для тестування, а perl-modules – це щось зовсім загальне.

Та іноді буває, що модуль Perl не дуже поширений і тому не потрапляє до пакунку у дистрибутиві Лінукс. У таких випадках слід встановлювати його зі CPAN – http://www.cpan.org/

На CPAN можна знайти майже будь-який модуль, скачати його і встановити вручну, але це довго. Простіше запустити утиліту cpan і встановити через неї.

Наприклад, Perl сценарій видав таку помилку:

Can't locate Geography/Countries.pm in @INC ...
Compilation failed in require at ...

Запускаємо cpan і по назві файлу Geography/Countries.pm ми вже знаємо ім’я пакету – Geography::Countries.

# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9402)
Enter 'h' for help.

cpan[2]> install Geography::Countries 
Running install for module 'Geography::Countries'
CPAN: Data::Dumper loaded ok (v2.124)
...

І через декілька секунд модуль все успішно встановлений.

Локаль у Debian

Про локаль у Лінукс ми згадуємо, як правило, під час початкового встановлення системи, або коли треба запустити програму з англомовним інтерфейсом.

Але сьогодні я зіштовхнувся з проблемою додавання нової локалі до системи, що вже налаштована. Мені потрібно було на своєму робочому комп’ютері встановити локаль яка встановлена на сервері.

Виявилось, що Debian досить стримана система і за умовчанням не встановлює всі локалі без винятку. Так в мене був дуже короткий список:

$ locale -a
C
POSIX
uk_UA.utf8

Та на сервері не було локалі uk_UA.utf8. Замість неї стояла en_US.utf8. І саме її я вирішив встановити собі.

Для цього слід використовувати команду:

# dpkg-reconfigure locales

На екрані з’явиться простий інтерфейс в якому можна вибрати потрібні локалі та обрати одну за умовчанням.

Якщо такої команда у Вас у системі не має, то спершу встановіть її пакет:

# apt-get install debconf

 

Порівняння вмісту директорій

Більшість користувачів Лінукс знають, що команда diff застосовується для порівняння вмісту файлів, але вона також може порівнювати директорії.

Для цього достатньо викликати її з параметром -r

$ diff -r dir1 dir2

Мені вона стала у пригоді, коли треба було визначити розбіжності між двома WAR-файлами. Я розпакував їх вміст у дві директорії та порівняв їх.

Зручно те, що за умовчанням вона не показує розбіжності у двійкових файлах, а лише інформує, що файли різні.

Обробка сканованих документів

Відскановані документи часто займають дуже багато місця і потребують подальшої обробки у растрових графічних редакторах, таких як Gimp.

Та коли документів дуже багато і всі вони типові, хочеться якось автоматизувати цей процес. Наприклад, ви просканували паспорта та ідентифікаційні коди співробітників. На виході маємо велетенські графічні файли формату А4, причому на деяких паспорт та код розташовані одночасно. Задача перетворити все на файли прийнятного розміру та розділити спільні зображення (на те ще згори, та те що знизу).

На наше щастя вже давно існує консольна утиліта для цього. Входить вона у графічний пакет Image-Magick та називається mogrify.

Припустімо, що всі вхідні файли розташовуються в одному каталогу та мають розширення *.jpg. Ми зменшуємо їх габаритні розміри до 1500 пікселів та розділяємо навпіл горизонтально. Для цього вистачить всього однієї команди:

$ mogrify -resize 1500x1500 -crop 100%x50% *.jpg

Нові файли матимуть назви такого виду (приклад, file.jpg):

  • file-0.jpg – верхня частина
  • file-1.jpg – нижня частина

Вам залишається лише вручну видалити частини без корисного змісту – там де сканувалися документи формату А5.

Якщо Вам важливо зберегти пропорції сканованих малюнків, то можете зменшити їх розподільчу здатність та якість стискання JPEG. Наступна команда встановлює розподілчу здатність у 96 DPI та якість зображення 80%:

$ mogrify -resample 96 -quality 80% -crop 100%x50% *.jpg

Лінукс та програми для роботи з електронними книжками

e-book managementНаразі вже є гарною звичкою випускати вільне програмне забезпечення одразу для усіх популярних операційних систем. Не стало виключенням і ПЗ для роботи з електронними книжками, пристроями E-book.

Нагальної потреби у таких програмах немає, але все ж таки приємно, коли всі інструменти під рукою. Однією з таких програм є Calibre E-book management. В неї дещо дивний інсталятор – дуже довгий командний рядок, але все встановлюється швидко. До речі, ваш дистрибутив може мати цю програму у пакетах:

$ apt-cache search calibre
calibre - Конвертер та менеджер бібліотеки електронних книг
calibre-bin - Конвертер та менеджер бібліотеки електронних книг

У цієї програми дуже багато функцій, але особисто мені сподобалось підтримка дуже великої кількості E-book пристроїв та вміння конвертувати книжки з одного формата в інший. Так я без проблем переконвертував PDF у EPUB.

Також ця програма допоможе вам змінити автора чи назву книжки, що звичайно стане у пригоді, коли ви будете шукати книжку у E-book пристрої.