Показаны сообщения с ярлыком linux. Показать все сообщения
Показаны сообщения с ярлыком linux. Показать все сообщения

суббота, 21 декабря 2019 г.

Легковесный RDP-сервер на Debian 8 + XFCE (с русскоязычным интерфейсом)

1. Ставим Debian, выбираем русскую локаль
Если локаль по умолчанию английская, сменить её можно так:
https://wiki.debian.org/ChangeLanguage
# env | grep LANG
# export LANG=ru_RU.UTF-8
# dpkg-reconfigure locales


2. Настраиваем Iptables
Перед настройкой IPtables (запланировать перезагрузку через 10 минут)
shutdown -t 10 –r
shutdown –c


2.1. Создаем скрипт для iptables (не забываем chmod 0740)
nano /usr/local/firewall/firewall_static.sh

2.2. Правила
#!/bin/sh

PATH='/sbin'
ALLOW_SSH='10.10.10.0/24,192.168.1.1/32'
ALLOW_RDP='10.10.10.0/24,192.168.1.1/32'
WAN='eth0'

# Flush previous rules, delete chains and reset counters
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Default policies
iptables -P FORWARD DROP
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP

# Disable source-routed packets
echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_source_route
# Disable ICMP Redirect Acceptance
echo -n '0' > /proc/sys/net/ipv4/conf/all/accept_redirects
# Enable broadcast echo protection
echo -n '1' > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Enable bad error message protection
echo -n '1' > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# Enable loopback traffic
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Enable statefull rules (after that, only need to allow NEW conections)
iptables -A INPUT   -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


# Drop invalid state packets
iptables -A INPUT   -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT  -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

# Allow SSH management
iptables -A INPUT -i $WAN -s $ALLOW_SSH -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# Enable all outgoing traffic to internet
iptables -A OUTPUT -o $WAN -d 0.0.0.0/0 -j ACCEPT

# Allow RDP
iptables -A INPUT -i $WAN -s $ALLOW_RDP -p tcp --dport 3389 -m conntrack --ctstate NEW -j ACCEPT


## LOGGING to /var/log/messages
#iptables -A INPUT   -j LOG --log-level debug --log-prefix '[FW INPUT]:    '
#iptables -A OUTPUT  -j LOG --log-level debug --log-prefix '[FW OUTPUT]:   '
#iptables -A FORWARD -j LOG --log-level debug --log-prefix '[FW FORWARD ]: '


2.3 Создаем также правила для ipv6 в файле /usr/local/firewall/ipv6_firewall.sh
(не забываем chmod 0740)
#!/bin/sh
PATH='/sbin'

# Flush the tables to apply changes
ip6tables -F

#ACCEPT POLICY
ip6tables -P INPUT DROP #If it doesn't match a rule Drop it
ip6tables -P FORWARD DROP #NO ROUTING POLICY DROP
ip6tables -P OUTPUT ACCEPT #If it doesn't match a rule

########
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -m state --state ESTABLISHED,RELATED -A INPUT -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT


2.4. Добавляем . /usr/local/firewall/firewall_static.sh и . /usr/local/firewall/ipv6_firewall.sh
в /etc/rc.local перед exit0

2.5. Проверяем счетчики iptables
iptables -vL


3. Ставим XFCE
apt update
apt install mc
apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils


4. Собираем xrdp
https://github.com/neutrinolabs/xrdp/wiki/Building-on-Debian-8

apt-get install git autoconf libtool pkg-config gcc g++ make  libssl-dev libpam0g-dev libjpeg-dev libx11-dev libxfixes-dev libxrandr-dev  flex bison libxml2-dev intltool xsltproc xutils-dev python-libxml2 g++ xutils libfuse-dev libmp3lame-dev nasm libpixman-1-dev xserver-xorg-dev

mkdir Downloads
cd Downloads
git clone https://github.com/neutrinolabs/xrdp.git
git clone https://github.com/neutrinolabs/xorgxrdp.git


cd /home/user/Downloads/xrdp
./bootstrap
./configure --enable-fuse --enable-jpeg
make
make install


cd /home/user/Downloads/xorgxrdp
./bootstrap
./configure
make
make install


systemctl daemon-reload
systemctl enable xrdp.service
systemctl enable xrdp-sesman.service
systemctl start xrdp

systemctl status xrdp


5. Ставим браузер и офис с пакетом локализации
apt install iceweasel libreoffice xfonts-mathml libreoffice-l10n-ru myspell-ru hyphen-ru libreoffice-grammarcheck-ru libreoffice-help-ru mythes-ru

6. Создаём группу rdp-users и добавляем в неё пользователей
addgroup rdp-users
adduser <username> --ingroup rdp-users


7. Смотрим логи
tail -F /var/log/xrdp.log
tail -F /var/log/xrdp-sesman.log


8. Для того, чтобы добавить клавиатурный шорткат для смены раскладки в xfce сначала добавляем на панель индикатор раскладки, далее, щёлкнув по нему правой кнопкой переходим в настройку параметров и выбираем шорткат.





пятница, 29 января 2016 г.

Как безопасно хранить пароли и проводить аутентификацию пользователей на почтовом сервере

Написать эту заметку мне помогла статья о хешировании паролей: https://crackstation.net/hashing-security.htm и книга Dovecot: POP3/IMAP servers for enterprises and ISPs (root's reading), которую написал автор dovecot Peer Heinlein.

Для авторизации пользователей почтовому серверу (или любому другому веб-сервису) требуется иметь базу с именами пользователей и их паролями.

При таких условиях возникает две угрозы: 1. Компрометация сервера: злоумышленник получает доступ к базе данных и может узнать все пароли 2. Передача информации в процессе аутентификации пользователей через незащищенные сети: злоумышлинник может получить один или множество паролей "прослушивая" трафик.

Для борьбы с угрозой 1.  существует метод хранения паролей виде хеша, т.е. набора символов фиксированной длины, который получается в процессе обработки данных (в нашем случае пароля, придуманного пользователем) с приминением криптогафической функции.  Функции, применяемые для хеширования паролей, такие как, например, SHA256 и SHA512 работают таким образом что вычисление хеша заданной строки происходи быстро (за милисекунды) а на то, чтобы обратить действие функции (узнать пароль по хешу) требуются годы.

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

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

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

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


Для борьбы с угрозой 2. существует т.н. CRAM (challenge-response authentication method), в рамках которого в процессе аутентификации пароль в явном виде не передается, а передается только хеш. Но в данном случае появляется сложность: для того, чтобы работали безопасные методы аутентификации (т.е. не передающие пароль в явном виде) требуется хранить пароль  в явном виде на сервере. Таким образом, если злоумышленник получает доступ к базе, он получает доступ ко всем паролям. Некоторые системы предлагают использовать CRAP и хранить пароли в виде хешей, но компрометация базы в таком случае так  же опасна, как если бы пароли хранились в явном виде, т.к. используя хеш, злоумышленник может  аутентифицироваться на сервере, даже не зная пароля, поскольку CRAM оперериует именно хешами.

Таким образом, существует 2 безопасных ( с точки зрения защиты от описанных выше угорз) метода хранения паролей и аутентификации:

1. Использование метода аутентификации SCRAM, которая аналогична CRAM, но работает с "солеными" хешами. Благодаря этому, получение злоумышленником доступа к базе паролей на сервере или прослушивание трафика не позволят ему аутентифицироваться на сервере.

2. Использование метода аутентификации PLAIN/LOGIN при котором пароли передаются в явном виде, хранение паролей в виде "соленых" хешей. Чтобы защититься от прослушивания трафика, следует использовать SSL/TLS
















понедельник, 28 декабря 2015 г.

Dovecot: немного теории и первоначальные настройки

Почтовые серверы используют протокол SMTP для взаимодействия между собой и доставки почты. Почтовые клиенты (например Outlook или Thunderbird), как правило, используют SMTP для отправки почты. Тем не менее, SMTP не предназначен для получения почты, только для отправки. Таким образом, MTA (mail transfer agents), которые занимаются транспортировкой писем, полученных от клиентов, не имеют ничего общего с получением почты.

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

четверг, 19 ноября 2015 г.

Защита системы


Супер сервер (super server) - сервер, прослушивающий сетевые соединения вместо другого сервера, и передающий ему управление, если соединение устанавливается. Использование супер севрера может быть удобно, если он управляет несколькими серверами, т.к. это уменьшает нагрузку на управляемые серверы и позволяет централизованно управлять настройками безопасности. Наиболее популярные супер серверы inetd и xinetd.

Настройки inet.d в файле /etc/inetd.conf и директории /etc/inetd.d

Пример настройки для ftp  сервера: 
ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd -l
Данная строка состоит из следующих полей:
-имя службы
-тип сокета: stream - надежная двунаправленная передача, dgram - менее надежная передача с меньшим количеством служебной информации, raw - сырой сокет
-протокол  - как правило tcp или udp
-wait/no wait - для сокетов типа dgram эта запись определяет поведение сервера: подключиться к клиенту и освободить сокет (no wait) или обработать все пакеты и отключиться по таймауту (wait). Для других типов сокетов следует указывать nowait.
-пользователь - пользователь от имени которого запускается сервер. Всегда, когда это возможно, серверы следует запускать от имени непривилегированного пользователя.
-имя сервера - в примере это /usr/sbin/tcpd то есть исполняемый файл tcp-wrapper'а
-параметры - все значения указанные после имени сервера являются параметрами, передаваемыми серверу. Если используется tcp-wrapper ему в качестве параметра передается имя реального сервера, в примере это /usr/sbin/in.ftpd

среда, 4 ноября 2015 г.

Написание скриптов, настройка почты, использование баз данных


Задать переменную среды: HOSTNAME=carson.example.com
Сделать переменную среды доступной для пользователей: export HOSTNAME
Вывести переменную среды на экран: echo $HOSTNAME
Задать переменную среды для отдельной программы: env DISPLAY=seeker.example.com:0.0 nedit (env принимает опции: -i запуск с пустой средой, -u - удалить значение определенной переменной).
Наиболее распространенные переменные среды:
-USER, USERNAME - имя пользователя 
-SHELL - путь к текущей командной строке
-PWD - текущая рабочая директория
-HOSTNAME - текущее TCP/IP имя хоста
-PATH - директории, в которых будет производиться поиск исполняемых файлов
-HOME - путь к домашней директории пользователя
-MAIL - путь к временным файла почты (mail spool)
-LANG - текущий язык
-TZ - часовой пояс
-LD_LIBRARY_PATH - директории в которых будет проиводиться поиск файлов библиотек
-PS1 - сообщение по умолчанию в командной строке. Как правило содержит перменные, такие как \u (пользователь), \h (имя хоста), \W (рабочая директория)
-TERM - имя текущего типа терминала (например xterm)
-DISPLAY - дисплей, используемый Х сервером. Как правило 0:0 (первый дисплей). Если на компьютере запущено несколько сессий Х, у каждой будет свой номер дисплея, например 0:0 у первой, 1:0 у второй и т.д.
-EDITOR - программа, которая запускается при вызове другой программой текстового редактора (обратить внимание: графические редакторы могут вызывать проблемы, если запускать их в текстовом режиме)

четверг, 1 октября 2015 г.

Администрирование системы

Администрирование системы
Настройки групп хранятся в файле /etc/group
Пользователь может быть членом нескольких групп, но по умолчанию каждому пользователю назначается первичная (primary) группа. Данные о первичных группах пользователей хранятся в файле /etc/passwd Когда пользователь авторизуется на компьютере, он рассматривается как член первичной группы. Когда пользователь создает файлы или запускает программы, эти файлы и программы ассоциируются с первичной группой (тем не менее пользователь может получить доступ к файлам других групп, являясь членом этой группы и имея соответствующие права. не обязательно, чтобы эта группа была первичной). Чтобы запустить программу или создать файл с группой, отличной от первичной, следует выполнить команду newgrp, чтобы сменить текущее членство в группе. Также можно изменить группу, связанную с конкретным файлом командами chgrp и chown.

В линукс пользователи и группы определяются с помощью ID (UID и GID). UID и GID с 0 по 99 зарезервированы системой для внутреннего использоания. 0 соответствует root. Обычно аккаунты полльзователей начинаются с 500 или 1000. Следует избегать повторного использования ID, т.к. если файлы старого пользователя не удалены, новый пользователь может стать их владельцем. Возможно создать несколько пользователей и/или групп с одинаковым ID. Фактически это будут разные пользователи с разными паролями и домашними директориями, но в плане прав доступа к файлам система будет рассматривать их как одного пользователя (группу). Злоумышленники часто создают аккаунт с UID 0, чтобы получить права суперпользователя. Если в системе появился подозрительный аккаунт с UID 0 - система скорее всего скомпрометирована.

вторник, 8 сентября 2015 г.

Настройка оконной системы X, локализаций и печати.



Реализации Х-сервера:
-XFree86 - основной сервер до 2008г
-X.org-X11 - большинство дистрибутивов перешло на этот сервер в 2004году.
-Accelerated-X - коммерческая версия.

Утилиты для настройки X-сервера:
XFree86 -configure
Xorg -configure
Также в разных дистрибутивах существует собственные утилиты.
Файл настроек: /etc/X11/xorg.conf

Для того, чтобы отключить Х сервер можно перейти на уровнь запуска, где он не работает (telinit 3)
В Debian-подобных дистрибутивах уровни запуска не используются для того чтобы останавливать или запускать Х. Для отключения графической оболочки следует ввести команду /etc/init.d/xdm stop (возможно понадобится заменить xdm на gdm, kdm, mdm, или lightdm)
После того, как настройки Х отредактированы, можно переключиться обратно в графический режим командой telinit 5 либо startx.
Также процесс Х можно завершить сочетанием клавиш Ctrl+Alt+Backspace, или командой kill (ps ax | grep X для поиска ID)
При конфигурировании Х лучшим подходом является поиск неработающих опций и их отключение.

Настройки клавиатуры в секции "input device". Можно настроить драйвер, раскладку, повтор символов.

четверг, 30 июля 2015 г.

Загрузка Linux

Существует 2 вариант загрузки системы:
1. Первичный загрузчик просматривает таблицу разделов, находит раздел, помеченный как загрузочный и выолняет код в загрузочном секторе данного раздела. Данный загрузочный сектор содержит вторичный загрузчик, который в свою очередь ищет ядро системы, загружает и выполняет его.
2. Первичный загрузчик ищет ядро системы, загружает и выполняет его.

Суперблок - часть фс, описывающая е базовые функции, такие как размер и статус. Может содержать часть загрузчика.

EFI в отличие от BIOS полагается не на код в загрузочном секторе, а на загрузчик в разделе ESP. В линукс ESP обычно монтируется в /boot/efi Загрузчик содержится в файле с расширением .efi и находится в отдельной поддиректории название которой совпадает с названием ОС. Это позволяет устанавливать параллельно две или более ОС.

четверг, 16 июля 2015 г.

Управление файлами в Linux

Рекомендуется использовать в именах файлов только буквы, цифры и символы (.), (-), (_).
Пробелы в именах файлов при  работе в командной строке должны предваряться символом "\" или имя файла должно быть взято в кавычки.

Вывести список файлов в директории: ls -a (отобразить все файлы, втч с названием, начинающимся с точки), --color (элементы списка разных типов (файлы, директории, символические ссылки) обозначаются разыми цветами), -l (отобразить разрешения, владельца, группу, размер, дату создания), -F (отобразить типы файлов: / - директория, @ - символическая ссылка, = - сокет, | - пайп)

Копировать файлы: cp -f  (перезапись без предупреждения), -i (выдвать запрос на перезапись), -p (сохранять владельца и разрешения - по умолчанию владельцем скопированного файла становится пользователь от имени которого выполняется команда), -R (копировать поддиректории), -a (аналог -R, но сохраняет владельца, и копирует линки а не файлы, на которые они ссылаются),  -u (файл копируется только если оригинал новее конечного файла или конечный файл не существует)

четверг, 9 июля 2015 г.

Немного о Postgre SQL

Записи в таблице называются кортежами  (tuples)
Кортеж - упорядоченная группа компонентов или атрибутов, каждый из которых имеет определенный тип.
Все кортежи дожны иметь одинаковое количество типов компонентов.
В таблице не должно быть идентичных кортежей.
Каждый атрибут должен быть атомарным, т.е. не являться другой записью или или списком атрибутов.
Атрибут опеределяющий отдельную запись в таблице называется первичным ключом.

SQL (обычно произносится как "sequel") - язык запросв, разработанный IBM. Т.к. оригинальный SQL не включает себя ряд команд, необходимых для администрирования баз данный, появляются вариации SQL, реализованные разными разработчиками (Oracle, MS и тд)

Типы команд SQL
-Data manipulation language (DML) - команды для ввода, удаления, обновления и выборки данных из базы
-Data definition language (DDL) - команды для создания таблиц, определения взаимосвязей.
-Data control Language (DCL) - команды для контроля разрешений и определения прав доступа.


Управление аппаратной частью в Linux

Managing hardware

Посмотреть информацию о процессоре и оперативной памяти компьютера:
cat /proc/meminfo
cat /proc/cpuinfo

Посмотреть информацию о сетевых устройствах:
lshw -C network

Прошивка (firmware) инициализирует оборудование материнской платы и контролирует процесс загрузки. В прошлом, большинство компьютеров с архитектурой  х86 и х86_64 использовало BIOS. Начиная с 2011  года получил распространение новый тип прошивки, известный как Extensible Firmware Interface (EFI).

Прерывание (IRQ) сигнал процессору прервать выполнение текущей задачи и обработать внешнее событие, например ввод с клавиатуры.
Просмотреть список IRQ: cat /proc/interrupts
/proc это виртуальная файловая система, которая не ссылается на реальные файлы на жестком диске. Это данные из ядра, которые удобно представлять в используя фаловую систему. /proc предоставляет информацию об устройствах, процессах, и т.д.
На современном оборудовании конфликты IRQ редки, но в случае, если он все-таки случается, нужно настроить устройства  таким образом, чтобы они использовали разные IRQ.

Управление программами в Linux

RPM-дистрибутивы: Fedora - бесплатный вариант для домашних пользователей, RHEL - платный для энтерпрайзов, CentOS - бесплатный для энтерпрайзов
Именование RPM-пакетов: packagename-a.b.c-x.arch.rpm, где packagename - имя пакета, a.b.c - номер версии, x - номер билда (изменения, внесенные теми, кто собирал пакет, а не авторами программы, например изменения конфигурационных файлов. иногда к номеру билда добавляют буквы, чтобы различать билды,собранные разными группами), arch - архитектура.
Ключи RPM: -i установить, -e удалить, -l отобразить файлы в пакете, -h отобразить прогресс установки, -qi отобразить информацию о пакете
Собрать пакет из исходников: rmpbuild
Извлечь содержимое RPM-пакета: rmp2cpio (RPM это, как правил, модифицированный cpio архив, сначала конвертирует в стандартный cpio), cpio (затем извлекаем)
Паектный менеджер: yum
Основной файл конфигурации RPM: /usr/lib/rpm/rpmrc, Yum: /etc/yum.conf (основные опции), /etc/yum.repos.d/ (репозитории)


Ключи dpkg:
-i установить, --configure запустить post-installation скрипты (переконфигурирует пакет), -r удалить (с сохранением конфигурационных файлов), -P удалить (вместе с конфигурационными файлами), --get-selections (-l) показать установленные пакеты -L список файлов относящихся к пакету -C поиск незавершенных установок --no-act проверка зависимостей и конфликтов без устновки

Основы командной строки в Linux

cd - сменить рабочую директорию
~ - сокращение, обозначает домашнюю директорию пользователя
pwd - выводит на экран текущую рабочую директорию
echo <> - выодит на экран текст <>. Полезно для скриптов, а также для просмотра переменных среды.
time <command> - сколько требуется команде для выполнения

exec <команда> запустить команду, при этом команда заменяет консоль
<команда>& -запустить команду в фоновом режиме

В некоторых случаях, внутренние команды (встроенные в bash) и внешние команды могут выдавать разные результаты для однихи тех же команд и принимать разные опции.
Если директории, где находится программа нет в переменной среды PATH, нужно прописывать полный путь к этой программе (например /home/user/myprog вместо ./myprog)
Следует избегать добавления в PATH для рута директорий с  графическими и другими программами, предназначенными для запуска пользователем, а также не добавлять в PATH рута текущую директорию (./), т.к. это позволяет запустить потенциально опасные программы под видом системных.