Слава нації
#StandWithUkraine

Роман Теличко

Блог з програмування, оптимізації та адміністрування систем

Тег linux

Linux. Настройка двухэтапной аутентификации для пользователя root

// 15 Квітня, 2014 | 2434 переглядів | коментарів (0)

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

Начнём с установки OATH Toolkit что уже есть в репозитории Debian.

apt-get install oathtool libpam-oath

Далее нам потребуется сгенерировать случайную строку (секретную фразу) на основе которой и будут генерироваться случайные временные одноразовые ключи. Поэтому стоит держать эту строку в секрете.

head -c 4096 /dev/urandom | md5sum | awk '{print $1}'
6819c89679c56508fec770362e312c4e

В данном примере секретная фраза это 6819c89679c56508fec770362e312c4e.

Теперь нам необходимо создать файл (/etc/users.oath) с описанием алгоритмов работы, пользователя и его секретной фразы.

echo "HOTP/T30 root - 6819c89679c56508fec770362e312c4e" > /etc/users.oath
chown root:root /etc/users.oath
chmod 600 /etc/users.oath

Далее – редактирование файла /etc/pam.d/su.
Вам необходимо дописать после

auth       sufficient pam_rootok.so

строку

auth requisite  pam_oath.so usersfile=/etc/users.oath window=10 digits=6

Где
usersfile – путь к файлу с описанием пользователей и их секретных фраз,
window – размер “окна”. Поскольку временный одноразовый ключ создаётся относительно времени, то окно – это расхождение серверного времени от времени клиента/приложения. Одно “окно” – 30 секунд. Т.е. мы задали максимальное расхождение ключей в 5 минут.
digits – необходимое количество цифр во временном одноразовом ключе.

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

oathtool --verbose --totp 6819c89679c56508fec770362e312c4e

На что получим что-то следующее:

Hex secret: 6819c89679c56508fec770362e312c4e
Base32 secret: NAM4RFTZYVSQR7WHOA3C4MJMJY======
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2014-04-15 05:36:28 UTC (1397540188)
Counter: 0x2C6D360 (46584672)

385762

385762 – это и есть наш одноразовый временный пароль, а вот строку Base32 secret мы будем использовать когда будем настраивать приложение для телефона (только вводить мы будем этот код без знаков “=”, т.е. как NAM4RFTZYVSQR7WHOA3C4MJMJY).

У Google есть отличная программа для генерирования временных (одноразовых) ключей – Google Authenticator
На официальной странице детально расписано как установить это приложение для телефонов на базе Android, iOS, Blackberry и т.п. поэтому на этом шаге я останавливаться не буду.

И наконец тестируем!

Подключаемся к серверу другим соединением (на всякий случай не закрывайте сессию root!) и пробуем сделать su
Система должна нас вначале спросить одноразовый временный пароль.

$ su
One-time password (OATH) for `root':

Генерируем одноразовый временный пароль либо через консоль с помощью команды oathtool, либо через приложение на вашем телефоне и вводим его.
Если вы всё сделали правильно, то после ввода временного пароля система вам предложит ввести пароль рута.

Это всё. Удачи!

ТОП 15 продвинутых команд для работы с tcpdump

// 14 Лютого, 2014 | 11175 переглядів | коментарів (0)

Решил составить ТОП 15 самых интерестных способов использования программы анализатора траффика (сниффера) tcpdump.

  • Получение всей полезной информации о пакете.
    tcpdump -nnvvXSs 1514 -i $INTERFACE
  • Перехват логина и пароля для протоколов pop3, imap, smtp и http
    tcpdump -i $INTERFACE port http or port smtp or port imap or port pop3 -l -A \
    | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
  • Сниффинг HTTP траффика
    tcpdump -i $INTERFACE port 80 -w - 
  • Анализирует траффик удаленно через SSH с помощью Wireshark
    ssh root@HOST tcpdump -U -s0 -w - 'not port 22' | wireshark -k -i -
  • Отображает пропускную возможность сети.
    tcpdump -w - | pv -bert >/dev/null 
  • Сниффинг удаленной сети для получения pcap файла в режиме командной строки.
    Прервать сбор можно нажатием CTRL+C, после чего открыть его с помощью wireshark для более детального анализа так: wireshark /tmp/sniff.pcap
    Запускается на удалённом хосте.

    tcpdump -v -i $INTERFACE -s 0 -w /tmp/sniff.pcap port  
  • Анализ SMTP. Вы можете запустить это на почтовом сервере, чтобы посмотреть отправителей электронной почты и получателей.
    tcpdump -l -s0 -w - tcp dst port 25 | strings | grep -i 'MAIL FROM\|RCPT TO'
  • Захват 1500 байт данных в ASCII-режиме на 80-ом порту.
    tcpdump -i $INTERFACE -n tcp port 80 -A -s1500
  • Захват траффика memcached
    tcpdump -i $INTERFACE -s 65535 -A -ttt port 11211
  • Сниффинг траффика и переадресация его в snort на машину 192.168.0.2

    Запускается на удалённом хосте.

    tcpdump -nn -i $INTERFACE -w - | nc 192.168.0.2 666
  • Получение информации о Cisco-сети (VLAN тэг, порт, switch, …)
    tcpdump -nn -v -i $INTERFACE -s 1500 -c 1 'ether[20:2] == 0x2000'
  • Отображение SYN-пакетов для всех сетевых интерфейсов
    tcpdump -i any -n tcp[13] == 2
  • Сниффинг всех DNS запросов и ответов
    tcpdump -i $INTERFACE 'udp port 53'

  • Сниффинг TCP и UDP траффика, исключая SSH
    tcpdump -n -v tcp or udp or icmp and not port 22

Увеличиваем таймаут разрыва соединения с сервером через SSH

// 13 Лютого, 2014 | 7341 переглядів | коментарів (0)

Иногда необходимо постоянно (или довольно долго) держать соединение с сервером по SSH. Но это наталкивает на проблему разрыва соединения с сервером из-за длительной неактивности клиента. Существует 2 варианта решения этой проблемы.

Способ №1.
Если у вас есть root-доступ к серверу, то вы можете просто установить значение в файле конфигурации SSH /etc/ssh/sshd_config

ClientAliveInterval 60

Эта строчка устанавливает интервал времени ожидания в секундах, после которого демон SSH sshd отправит клиенту NULL-пакет для поддержания соединения.
По умолчанию, значение этой переменной 0, что означает что сервер не будет поддерживать соединение с клиентом и разорвёт его после длительного отсутствия активности.
Не забудьте перезапустить sshd на сервере после сохранения файла.

Способ №2.
Второй способ проще и его можно применить ко всем вашим SSH-подключениям сразу.
Просто добавьте эти строчки в файл ~/.ssh/config на вашей локальной машине:

Host *
  ServerAliveInterval 60

Если у вас не было этого файла, тогда создайте его, установив ему права 600:

chmod 600 ~/.ssh/config

Эти строчки заставляют отправлять ваш ssh-клиент каждые 60 секунд KeepAlive сообщения для всех серверов к которым вы будете подключаться, тем самым поддерживая с ними постоянное соединение.

Это всё.

Настройка Linux для высоконагруженных проектов и защиты от DDoS

// 16 Грудня, 2013 | 99083 переглядів | коментар (1)

В Интернете довольно много разных примеров конфигурации ядра Linux для поддержания большого количества соединений, высоконагруженных веб проектов и противодействия DDoS-атакам. Вот ещё один из примеров, что я уже смог попробовать на практике. Скажу сразу — мне более чем помогло. Попробуйте и вы.

Вот опции, что необходимо добавить в конец /etc/sysctl.conf

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

А теперь о каждой опции более детально.
Читати далі…

Настройка nginx + php5-fpm под Linux/Debian

// 15 Грудня, 2013 | 26342 переглядів | 29 коментарів

Сегодня я расскажу как настроить связку nginx + php5-fpm под Debian.

Начнём с инсталляции nginx.
И тут же мы сталкиваемся с тем, какой именно пакет ставить, т.к. их существует аж три:

  • nginx-light
  • nginx-full
  • nginx-extras

Отличаются они только поставкой дополнительных модулей.
Вызовем описание пакета nginx-light

aptitude show nginx-light

aptitude покажет какие именно дополнительные модули входят в “лёгкую” версию nginx

STANDARD HTTP MODULES : Core, Access, Auth Basic, Auto Index, Charset, Empty GIF, FastCGI, 
                        Gzip, Headers, Index, Log, Map, Proxy, Rewrite, Upstream. 
OPTIONAL HTTP MODULES : Gzip Precompression, IPv6, SSL, Stub Status.  
THIRD PARTY MODULES   : Echo.

А теперь для сравнения выведем список модулей “расширенной” версии nginx

aptitude show nginx-extras
STANDARD HTTP MODULES : Core, Access, Auth Basic, Auto Index, Browser, Charset, Empty GIF, 
                        FastCGI, Geo, Gzip, Headers, Index, Limit Requests, Limit Zone, Log, 
                        Map, Memcached, Proxy, Referer, Rewrite, SCGI, Split Clients, SSI, 
                        Upstream, User ID, UWSGI.  
OPTIONAL HTTP MODULES : Addition, Debug, Embedded Perl, FLV, GeoIP, Gzip Precompression, 
                        Image Filter, IPv6, MP4, Random Index, Real IP, Secure Link, SSL, 
                        Stub Status, Substitution, WebDAV, XSLT. 
MAIL MODULES          : Mail Core, IMAP, POP3, SMTP, SSL. 
THIRD PARTY MODULES   : Auth PAM, Chunkin, DAV Ext, Echo, Embedded Lua, HttpHeadersMore, 
                        http push, Nginx Development Kit, Upload module, Upload Progress, 
                        Upstream Fair Queue.

Как видите, список модулей и дополнений впечатляет.
С их подробной конфигурацией вы можете ознакомиться здесь и здесь.
Я рекомендую ставить nginx-light, т.к. чем меньше будет доставлено пакетов, тем меньше памяти будет “кушать” ядро nginx. Но также необходимо учитывать нужные модули для работы.
Читати далі…

Подключаемся к удаленному серверу по SSH через SOCKS 5 прокси

// 21 Листопада, 2013 | 2826 переглядів | коментарів (0)

Иногда необходимо подключится к удаленному серверу по протоколу SSH через существующий SOCKS 5 прокси, что может быть создан как из SSH-подключения к другому серверу, так и другими способами.
Сегодня я расскажу об этом.

В этой статье я уже писал как создать SOCKS 5 прокси на сервере имея SSH-доступ к нему. Для примера сделаем SOCKS 5 на одном сервере и подключимся через него к второму.

На сервере с SOCKS 5 прокси (если он создаётся через SSH, а не другими способами) в файле настроек SSH /etc/ssh/sshd_config должна быть строчка разрешающая пересылку TCP-пакетов:

AllowTcpForwarding yes

Без неё у вас врядли что-то получится.

Итак, используя шаблон

ssh -f -C2qTnN -D <порт> <удаленный_пользователь>@<удаленный_сервер>

запустим прокси на порту 1080 для сервера 8.8.8.8 например так

ssh -f -C2qTnN -D 1080 [email protected]

Теперь сама строчка подключения к второму удаленному серверу по протоколу SSH через SOCKS 5 прокси:

ssh -o ProxyCommand="nc -x 127.0.0.1:1080 %h %p" [email protected]

Где
127.0.0.1:1080 – IP и порт SOCKS 5 прокси
roman – это ваш логин на сервер
8.8.4.4 – адрес вашего сервера

Это всё.
Удачи!

PostgreSQL. Храним таблицу в оперативной памяти (RAM)

// 7 Листопада, 2013 | 7164 переглядів | коментарів (0)

Несмотря на то что PostgreSQL является довольно мощной базой данных, в ней отсутствует полноценная поддержка хранения таблиц в оперативной памяти.
Ниже я расскажу как заставить PostgreSQL хранить выбранные таблицы в оперативной памяти для быстрых операций с ними.
Всё будет происходить в Debian.

Создадим пустую папку для монтирования

mkdir /mnt/ramfs

И смонтируем в неё ramfs

mount -t ramfs none /mnt/ramfs

Создадим папку для PostgreSQL и назначим на неё права.

mkdir /mnt/ramfs/pgdata
chown postgres:postgres /mnt/ramfs/pgdata
chmod 600 /mnt/ramfs/pgdata

Далее зайдём под суперпользователем базы данных PostgreSQL – postgres

su postgres
psql

И создадим новый TABLESPACE, размещение которого мы укажим в папке с смонтированной ramfs

postgres=# CREATE TABLESPACE ram LOCATION '/mnt/ramfs/pgdata';

Выдадим права на работу с этом TABLESPACE нашему пользователю (например myuser)

postgres=# GRANT CREATE ON TABLESPACE ram TO myuser;

Теперь нам осталось только создать новую таблицу и указать при её создании TABLESPACE ram.
Например:

CREATE TABLE mytesttable (
    begin_ip ip4 NOT NULL,
    end_ip ip4 NOT NULL,
    begin_num bigint NOT NULL,
    end_num bigint NOT NULL,
    country_code character(2) NOT NULL,
    country_name character varying(255) NOT NULL,
    ip_range ip4r
)
TABLESPACE ram;

Теперь PostgreSQL будет работать с этой таблицей как и с другими даже не подозревая что она “лежит” в ОЗУ.

Это всё.
Удачи.

Настройка связки nginx + SVN/Subversion + trac (без Apache)

// 30 Вересня, 2013 | 6881 переглядів | 2 коментарі

Сегодня я расскажу как можно отказаться от медленного Apache для настройки связки trac + SVN/Subversion. Итак, начнём.

1. Устанавливаем и настраиваем SVN/Subversion

Ставим SVN/Subversion на наш сервер

sudo apt-get install subversion

Создаём репозиторий (для примера — в папке /var/svn/my-repository)

sudo svnadmin create /var/svn/my-repository

Устанавливаем владельца www-data для папки с репозиторием

sudo chown -R www-data:www-data /var/svn/my-repository

Теперь нам необходимо выполнить импорт файлов в репозиторий.
Для этого создадим где-то на локальной машинке (впрочем, можно и прямо на удалённом сервере) папку с некоторым именем (для примера: my-files)

mkdir my-files

И выполняем первый импорт на наш настроенный SVN-сервер:

svn import -m 'initial commit' my-files svn+ssh://my-username@my-cool-webserver/var/svn/my-repository

Где
  my-files – папка с файлами которые необходимо проимпортировать в репозиторий,
  my-username – имя пользователя на сервере,
  my-cool-webserver – адрес сервера,
  /var/svn/my-repository – путь в файловой системе сервера к репозитории

Теперь мы можем выполнять коммиты в этот репозиторий, только вначале необходимо будет сделать checkout репозитория в папку для дальнейшей работы.
Делается это так:

svn checkout svn+ssh://my-username@my-cool-webserver/var/svn/my-repository

Данный способ настройки SVN/Subversion называется SVN over SSH.
Читати далі…

Как узнать температуру и нагрузку видеокарты ATI Radeon в Linux/Ubuntu

// 31 Серпня, 2013 | 9579 переглядів | 2 коментарі

Узнать текущую нагрузку (GPU Load) видеокарты и её температуру (GPU Temperature) можно с помощью стандартной утилиты проприетарного драйвера ATI Radeon.

Достаточно выполнить следующую команду:

# aticonfig --odgc --odgt

Вывод будет следующим:

Default Adapter - AMD Radeon HD 6670
                            Core (MHz)    Memory (MHz)
           Current Clocks :    810           1000
             Current Peak :    810           1000
  Configurable Peak Range : [400-900]     [1000-1150]
                 GPU load :    0%

Default Adapter - AMD Radeon HD 6670
                  Sensor 0: Temperature - 35.50 C

Кстати, я уже писал о том как установить проприетарный драйвер видеокарты ATI Radeon в Ubuntu.

Как установить драйвер видеокарты ATI Radeon в Ubuntu 13.04

// 30 Серпня, 2013 | 24550 переглядів | коментарів (0)

Сегодня я расскажу как установить проприетарный драйвер от ATI на видеокарту ATI Radeon в Ubuntu 13.04.

Для начала нам необходимо скачать свежие драйвера с официального сайта.
Вот ссылка для ленивых: https://support.amd.com/us/gpudownload/Pages/index.aspx

Поскольку у меня система 64-битная, в последнем дропдауне я выбрал Linux x86_64.
В итоге нас отправили на страницу скачивания AMD Catalyst™ 13.4 Proprietary Linux x86 Display Driver.
Скачиваем и распаковываем ZIP-архив.

Ещё нам необходимо установить зависимые пакеты

# sudo apt-get install ia32-libs debhelper dh-modaliases execstack lib32gcc1 libc6-i386 dkms libqtgui4

А также нужно удалить пакет xserver-xorg-video-radeon, т.к. он будет “мешать”

# sudo apt-get remove --purge xserver-xorg-video-radeon

Мы готовы к инсталляции.
Устанавливаем права на выполнение скачанного нами RUN-файла

# chmod +x amd-driver-installer-catalyst-*.run

Запускаем процесс сборки DEB-пакетов fglrx

# sudo ./amd-driver-installer-catalyst-*.run --buildpkg Ubuntu/raring
# sudo dpkg -i fglrx*.deb

Если пакеты успешно установлены, далее нам необходимо сгенерировать новый /etc/X11/xorg.conf файл.

Запускаем его генерацию так:

# sudo aticonfig --initial -f

В случаe, если у вас две видеокарты, тогда вам ещё нужно сделать так
ВАЖНО! Не запускайте эту строчку, если у вас видеокарты в режиме CrossFire

# sudo aticonfig --initial -f --adapter=all

В случаe двух мониторов вам нужно сделать вот так:

# sudo aticonfig --initial -f
# sudo aticonfig --set-pcs-str="DDX,EnableRandR12,FALSE"

Указываем системе на изменения файла /etc/X11/xorg.conf явно. Это важная строчка, без которой система просто не будет знать о том, что вы изменили этот конфигурационный файл.

# sudo aticonfig --input=/etc/X11/xorg.conf --tls=1

Перезагружаемся уже с новыми конфигами.

# reboot

Если вы дошли до графической среды — скорее всего вы всё сделали правильно.
Проверим это с помощью информационной утилиты fglrxinfo.

# fglrxinfo

Ответ должен быть каким-то таким:

display: :0.0  screen: 0
OpenGL vendor string: Advanced Micro Devices, Inc.
OpenGL renderer string: AMD Radeon HD 7800 Series 
OpenGL version string: 4.2.12217 Compatibility Profile Context 12.104

Запустим простую утилиту для тестирования графической карты.

# fgl_glxgears

Её вывод в консоль у меня был следующим:

11916 frames in 5.0 seconds = 2383.200 FPS

Вот и всё.
Удачи.