Авторизация на сервере FreeBSD по SSH ключам

Авторизация на сервере FreeBSD по SSH ключам

Исходные данные: имеется сервер на базе FreeBSD, имеются клиентские машины с которых надо периодически заходить на этот сервер. В качестве SSH-клиента используется PuTTY.
Задача: избавить себя от постоянного ввода паролей вручную и проходить авторизацию с помощью специальных ключей.

Для подключения клиента требуется сгенерировать два ключа — закрытй и публичный. В клиенте PuTTY это делается утилитой puttygen.exe. В открывшемся окне меняем значение Number of bits in a generated key с 1024 на более сложное, например 2343. Нажимаем кнопку Generate и водим мышкой чтобы создать случайный код.

По завершении генерации станут активными две кнопки — Save public key и Save private key. Нажимаем на первую кнопку и сохраняем публичный ключ с названием, к примеру, rsa-pub. Второй ключ сохраним как rsa-private. При этом программа напомнит, что нужно ввести еще секретную фразу т.к. это увеличит безопасность, но мы откажемся т.к. задача соединяться не вводя пароли.

Теперь соединяемся с нашим сервером и заходим в домашнюю папку того пользователя под которым будем соединяться с сервером. Создаем там директорию .ssh

$ mkdir .ssh

Ставим на папку права 700

Копируем туда наш публичный ключ. И в этой же директории выполняем следующую команду:

# ssh-keygen -i -f rsa-pub > authorized_keys

Открываем PuTTY выбираем нашу запись для соединения с сервером, и добавляем в раздел Connection — SSH — Auth путь к нашему приватному ключу. Всё, теперь можно коннектиться. Если всё сделано правильно то мы попадем в директорию пользователя без запроса пароля.

Есть другой вариант переноса публичного ключа на сервер. Необходимо создать в директории .ssh файл authorized_keys

$ touch authorized_keys

Открыть для редактирования этот файл и скопировать туда наш публичный ключ. Ключ должен идти в одну строчку. Перед ключом должно быть написано ssh-rsa и поставлен пробел.

Пример:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAZYQ69twq6e39+S6LxO62E37wtlGvVknomrTSdGD/QRTiNKwCI0WzFmOjvshFbzi+ARYRUcIQpxjO1nVfcO+RfJHCjX3vjgEeq1vxhag0PQs8mJLaddeCISpW37zpxYczDPTwEC7vVnzW9H1YcB1x42V9dL4JJzhbRUmHWEuNw1h+MM0eOnJLcUHZuHmxiP6M8y41UPenuVnAt2FaNWzxxMUjSKg6zCj3q07Td/ilrCvARs7/hFERG7pn6QN9At/EpTQvyn/aYDByPc4xUkeGTapzaMBYSrRIVpyYvDjJza3TAgIYejwLgV+gwlXMYKkvErsdm1hh+K4Ioe0zkbGzkaYUA+a7q3tzjY5taCDp/9LFjwhuMVcswnNAjLX+ct+sSIvZn/KnZjafcywjdmZc1Nhrl6b9AxnJ+h9PJ2BC73h90ZWvr5EASiXSgyI8A2y1ObVpLvoNIJu0DeKnIZnKarTbhXvQFAAeOzsxkTzb95ceX+llRUHqyOBpnB7D2DR8Im1tdVaQy9v9dZ329+Ogjg2BXKfL5Oh

Установка webalizer

Для того чтобы просматривать статистику на своём сайте я решил поставить на сервер webalizer — /usr/ports/www/webalizer. Поставил, заработало, но не показывало из каких стран заходили на сайт. В make я нашел упоминание о geolizer, который не установился вместе webalizer. Тогда я сделал так: обновил порты, и начал установку именно с geolizer. В конечном итоге всё заработало как надо, поэтому выкладываю последовательность действий. Идем в папку с geolizer и устанавливаем: # cd /usr/ports/www/geolizer # make install clean Установка должна потянуть за собой установку GeoIP. Если всё нормально, то приступаем к конфигурированию. Если выдается ошибка и ругается на webalizer то сначала придется удалить этот пакет (/usr/ports/www/webalizer, он был установлен мной ранее). Файл конфигурации располагается в /usr/local/etc

# cp /usr/local/etc/webalizer.conf-dist /usr/local/etc/webalizer.conf

Наиболее важные строчки конфигурации, без которых статистика не заработает: #Путь к логам апача LogFile /var/lib/httpd/logs/access_log #Путь к папке, куда будем складывать результат обработки статистики, с тем учетом, чтобы потом смотреть через браузер. #конечную папку нужно создать самому OutputDir /usr/local/www/data/webalizer #Эта строчка ставится в самом конце. Она нужна для того, чтобы видеть с IP каких стран заходили на сайт: GeoIP yes Конфигурация закончена. Для запуска статистики используем команду: # webalizer Смотреть статистику идем по адресу (учитывая внесенные в конфиг строчки) — http://yoursuite/webalizer/ Добавляем задачу в cron: */23 * * * * /usr/local/bin/webalizer Более подробно о настройках файла конфигурации webalizer.conf рассказано здесь — http://www.lissyara.su/?id=1182

Читать далее

Соединяем две сети через VPN IPSEC

Цель: подсоединить к локальной сети 6-го микрорайона свою домашнюю сеть из нескольких машин.
Исходные данные: в обоих сетях есть сервер с FreeBSD 6.2 имеющий две сетевых карты (одна смотрит в локалку, в другую подсоединен модем). Выход в Интернет осуществляется через ADSL модем, настроенный в режиме bridge.

Топология сети выглядит так:

1-ая сеть:

10.11.0.0/16
|
10.11.0.201
Сервер
85.192.х.х
|
|
Интернет
|
|
2-ая сеть
92.49.х.х
Сервер
10.10.38.50
|
10.10.0.0/16

Первоначально нужно пересобрать ядро с дополнительными опциями:
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/ IPSEC)

device gif

Компилируем новое ядро, инсталлируем и перезагружаемся.

Теперь создаем туннель и добавляем маршрутизацию:

На шлюзе 1:

ifconfig gif0 create
ifconfig gif0 10.11.0.201 10.10.38.50
ifconfig gif0 tunnel 85.192.x.x 92.49.x.x
route add 10.10.0.0/16 10.10.38.50

На шлюзе 2:

ifconfig gif0 create
ifconfig gif0 10.10.38.50 10.11.0.201
ifconfig gif0 tunnel 92.49.x.x 85.192.x.x
route add 10.11.0.0/16 10.11.0.201

По сути, после этих команд между сетями уже есть связь. Т.е. можно из подсети 1 зайти на компьютеры в сети 2. Единственный нюанс на компьютерах во 2 сети должен быть прописан шлюз по умолчанию — 10.10.38.50 иначе достучаться до них будет нельзя. Как подсказали знающие люди — выходом из этой ситуации является установка SNAT на втором шлюзе, но это не входило в мои планы.

Теперь можно приступать к шифрованию трафика. Для этого установим из портов — security/ipsec-tools. По идее после установки должна была создаться папка /usr/local/etc/racoon/ с конфигурационными файлами, но этого не произошло. Не беда, создадим их вручную:

/usr/local/etc/racoon/racoon.conf

path include «/usr/local/etc/racoon» ;
path pre_shared_key «/usr/local/etc/racoon/psk.txt» ;
path certificate «/usr/local/etc/racoon/cert» ;

padding
{
maximum_length 20; # maximum padding length.
randomize off; # enable randomize length.
strict_check off; # enable strict check.
exclusive_tail off; # extract last one octet.
}

listen
{
isakmp 222.222.222.222 [500]; #IP компьютера где расположен данный файл
}

timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per a send.
phase1 30 sec;
phase2 15 sec;
}

remote anonymous
{
exchange_mode aggressive,main,base;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 24 hour; # sec,min,hour
initial_contact on;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key ;
dh_group 2 ;
}
}

sainfo anonymous
{
pfs_group 1;
lifetime time 24 hour;
encryption_algorithm 3des ;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ;
}
#End of racoon.conf

/usr/local/etc/racoon/psk.txt

#На шлюзе 1 (secret — пароль):

92.49.х.х secret

#На шлюзе 2 (secret — пароль):

85.192.х.х secret

Ставим права на эти файлы:

# chmod 600 *

Создаем файл /etc/ipsec.conf:

#На шлюзе 1 (85.192.х.х):

spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P out ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;
spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P in ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;

На шлюзе 2 (92.49.х.х):

spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P out ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;
spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P in ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;

Выполняем на обоих шлюзах команды:

# racoon

# setkey -f /etc/ipsec.conf

Проверка работы racoon на шлюзе 1:

# sockstat | grep raco

root racoon 4527 3 dgram -> /var/run/logpriv
root racoon 4527 6 udp4 85.192.х.х:500 *:*

Проверяем работу командой setkey -D на шлюзе 1. Если ничего не вывелось, значит, шифрование не настроено.

# setkey -D

85.192.х.х 92.49.х.х
esp mode=tunnel spi=165916838(0x09e3b0a6) reqid=0(0x00000000)
E: 3des-cbc aecfd117 0739d66d 3400f094 e9411901 aa33570b ce7c2130
A: hmac-sha1 d1bc9b8f aa0c0bdc 795c800a 8ff4bc1d b3bd87a5
seq=0x00000375 replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 141600(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 885 hard: 0 soft: 0
sadb_seq=1 pid=4585 refcnt=2
92.49.х.х 85.192.х.х
esp mode=tunnel spi=42651354(0x028aceda) reqid=0(0x00000000)
E: 3des-cbc 85fe3e51 1c251e7d 22c51fbd 52a9a31c 769758ac c3c69b03
A: hmac-sha1 d90dc2db 8f56a6f0 cdd9fc17 5acae5a4 8c043102
seq=0x0000036e replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 91312(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 878 hard: 0 soft: 0
sadb_seq=0 pid=4585 refcnt=1

Для пущей достоверности запускаем со шлюза 1 команду:

# ping 10.10.38.50

На втором шлюзе запускаем:

# tcpdump -i tun0 host 85.192.х.х

Если трафик шифруется, то увидим примерно такой вывод:

17:51:34.927576 IP 85-192-x-x.dsl.esoo.ru > 92.49.x.x: ESP(spi=0x0f6188d3,seq=0x12e), length 140
17:51:35.056984 IP 92.49.x.x > 85-192-x-x.dsl.esoo.ru: ESP(spi=0x0b7e205d,seq=0x126), length 140

Для того чтобы VPN поднимался автоматически при загрузке сервера нужно прописать в /etc/rc.conf следующие строчки:

Для шлюза 1:

gif_interfaces=»gif0″
gifconfig_gif0=»85.192.x.x 92.49.x.x»
ifconfig_gif0=»inet 10.11.0.201 10.10.38.50 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.10.0.0/16 10.10.38.50″

ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»

Для шлюза 2:

gif_interfaces=»gif0″
gifconfig_gif0=»92.49.x.x 85.192.x.x»
ifconfig_gif0=»inet 10.10.38.50 10.11.0.201 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.11.0.0/16 10.11.0.201″

ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»

К сожалению, как показала практика, racoon не захотел стартовать автоматически, поэтому в crontab на обоих шлюзах была добавлена новая сточка:

@reboot /usr/local/etc/rc.d/racoon start

После повторной перезагрузки всё завелось. Как видим настройка VPN не так уж сложна.

Ссылки на наиболее интересные материалы по данной теме:

Использование ресурса DynDNS.org, установка клиента ddclient

Для начала нужно рассказать для чего может понадобиться использование сервиса https://www.dyndns.com. Как правило провайдеры выдают своим клиентам динамические IP адреса, которые могут меняться при каждой новой сессии. Т.о. если мы размещаем на своем сервере какой-либо ресурс (к примеру веб-сервер), то чтобы попасть на него из интернета нам понадобится каждый раз вводить правильный IP адрес сервера действительный на тот момент. Это конечно же очень неудобно. Чтобы обойти эту трудность можно воспользоваться сервисом на сайте https://www.dyndns.com. Смысл данного ресурса в том, что после регистрации на нем своего аккаунта мы бесплатно получаем доменное имя третьего уровня, к примеру shestoi.dyndns.org. Далее на своем сервере мы устанавливаем клиент ddclient в котором прописываем настройки для shestoi.dyndns.org. Теперь клиент ddclient будет с определенной периодичностью посылать на https://www.dyndns.com нынешний IP нашего сервера. Т.о. по адресу http://shestoi.dyndns.org будет доступен наш сервер.

Следует также заметить, что современные модемы как правило обладают функцией поддержки DynDNS и можно прописать настройки непосредственно на нём, без установки клиента на сервер.

Теперь о самой установке и настройки клиента ddclient.

# cd /usr/ports/dns/ddclient
# make install clean

Затем копируем и правим конфиг

# cp /usr/local/etc/ddclient.conf.sample /usr/local/etc/ddclient.conf
# chmod 600 /usr/local/etc/ddclient.conf (для безопасности, т.к. там пароли)

Отредактируем настройки

# vi /usr/local/etc/ddclient.conf

# Эти строчки сразу закоментируем, чтобы не сыпался лишний спам
#mail=root # mail all msgs to root
#mail-failure=root # mail failed update msgs to root

# включим метод определения реального (белого) ip-адреса
use=web

login=login # логин к dyndns
password=password # пароль к dyndns

server=members.dyndns.org, \
protocol=dyndns2 \
shestoi.dyndns.org # Обращу внимание на эту строчку. Здесь мы прописываем тот адрес который соответствует нашему серверу. Дело в том, что зарегистрировав аккаунт на https://www.dyndns.com мы можем создавать на нем несколько адресов и раздавать их нужным серверам.

Добавляем строчку для автозапуска при старте сервера

# echo ‘ddclient_enable=”YES”‘ >> /etc/rc.conf

Запускаем клиент без перезагрузки сервера: Код:
# /usr/local/sbin/ddclient start

Ссылки по теме:

  1. http://ihtiandr.info/unix/1-unix/70-dynamic-dns-install-freebsd-how-to.html
  2. http://linuxopen.ru/2007/11/14/dyndns-ili-staticheskijj-sajjt-na.html

Когда ты в армии (часть 7)

Эпилог

Ну, вот и всё, армейский путь окончен

Передо мною тысячи дорог…

(Из собственных стихов)

Вот и кончился один год моей службы. Не скажу, что это был самый плохой год в моей жизни. Были и печали и радости, но в целом я не жалею, что попал сюда, а уж тем более не жалею, что пошёл служить в армию. Как ни парадоксально, но служба дала мне толчок к карьерному росту в моей любимой области – информационных технологиях (но, как и почему это произошло я рассказывать, по определенным причинам, не буду). Еще раз напомню, что все события, описанные мною – это плод моей фантазии. Не стоит искать реальных подтверждений.