Настройка Linux (Slackware)

На горе лежит дискета,
у нее запорчен бут,
через дырочку в конверте
ее вирусы грызут ...

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

ПРЕДИСЛОВИЕ
ЧТО ТАКОЕ LINUX ?
ИНСТАЛЛЯЦИЯ SLACKWARE
НАСТРОЙКА SLACKWARE:
Настройка LILO
Настройка ядра
Защита системы
Настройка X-Window
Русификация
Модем
Поддержка звука
Sendmail
Подключение сканера
Пример
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЗ РОССИИ

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

Первое, ограничим возможность заходить администратору (root) удаленно. Те, кому это на самом деле надо, смогут зайти сначала под своим логином, а затем дать команду su Итак, файлик /etc/securetty

console
tty1
tty2
tty3
tty4
tty5
tty6
ttyS0
ttyS1
ttyS2
ttyS3
#ttyp0
#ttyp1
#ttyp2
#ttyp3
В нем перечислены консоли, откуда может логиниться root. tty# - это консоли, которые вы можете переключать по Alt-F#. ttyS# - это соответственно com-порты, к которым можно подключиться через модем или нуль-модемный кабель с любой другой машины. ttyp# - это консоли, которые используются, когда к машине подключаются удаленно через telnet. Как видите, напрямую root'у у меня можно логиниться только непосредственно с машины или с машин, которые непосредственно к ней присоединены , так как ttyp# отключены (ну или закомментарены символом #). Терминал console - это синоним tty1, остался от тех машин, к которым по умолчанию могут цепляться несколько аппаратных терминалов.

Так, root'а по сети обрезали, теперь увеличим длину воспринимаемого пароля. По умолчанию в slackware стоит максимальная длина воспринимаемого и проверяемого пароля в 8 символов. Конечно, перебрать пароль в 8 символов не так-то уж и легко, но лучше увеличить его. Смотрим файл /etc/login.defs и внимательно читаем комментарии к командам. FAIL_DELAY отвечает за задержку, которая будет, если пользователь набрал неправильный пароль. Ее стоит ставить в пределах 3-5 секунд, но не в коем случае не 0 !!! Иначе ваша машина окажется беззащитной перед попытками перебора пароля через сеть. Смотрим дальше ...CONSOLE как раз ссылается на тот файл, в котором сказано, откуда может логиниться root.PASS_MIN_LEN - указывает на минимальную длину вводимого пользователем пароля.SU_WHEEL_ONLY эта команда указывает, может ли любой пользователь давать команду su. По умолчанию любой (no). PASS_MAX_LEN - максимальная длина пароля. По умолчанию стоит 8 символов, но увеличение этого числа вам ничего не даст, так как функция crypt() в unix'e не умеет работать с паролями длинее 8 символов. Для увеличения длины пароля необходимо раскомментировать MD5_CRYPT_ENAB yes - во первых, это даст увеличение возможной длины пароля до 127 символов (а надо ли больше ?), а во вторых заставит перейти с схемы шифрования DES на MD5, что по утверждению авторитетных источников куда лучше. Все, теперь сохраняем этот файл и даем команду passwd - меняем пароль и смотрим в /etc/shadow - вы сразу заметите разницу. ;-)

Так, откуда еще root может залезть, ага, по ftp. Смотрим /etc/ftpusers - это если у вас стоит устанавливаемый по умолчанию сервер wu-ftp.

root
uucp
news
Выкинув комментарии, он у меня состоит всего из 3х строчек. В каждой строчке указывается пользователь, который не под каким соусом не должен пускать по ftp, даже если у него десять раз правильный пароль. И действительно, что этим пользователям делать на ftp ?;-)

Теперь будем защищаться от локальных пользователей, которые имеют физических доступ к машине. Если какой-нибудь хохотун (ну или НТ-шник ;-) по привычке или незнанию нажмет заветные 3 кнопки на консоли (Ctrl-Alt-Del), то slackware быстренько постарается перезагрузиться ... Вам это надо ? Ведь есть куда более прозаические способы закрыть Linux. Смотрим /etc/inittab

.......
# What to do at the "Three Finger Salute".
ca::ctrlaltdel:/sbin/shutdown -t5 -rf now
.......
Эта строка говорит, что будет делать Linux, если нажмут эти заветные 3 кнопки. Ставим символ # перед ca (у меня он и так стоит - кто знает, где стоит multik.istu.edu, не обольщайтесь ;-))) или поменяйте выполняемую команду на что-нибудь более прозаическое (типа echo "А ну-ка брысь отсюда!" >/dev/console ;-))). После редактирования дайте команду init q, чтобы init смог перечитать свои конфигурационные файлы и все, можете не беспокоиться насчет 3х кнопок ;-))))

Итак, вроде все защитили, вроде все, да не все .... попробуйте пройтись любым порт-сканером (пойдет даже Этот ) по любому свеже-установленному Linux'у и запишите все порты, которые от скажет, что открытые ...Потом позапускайте telnet [host] [port] ... вы оччень многое узнаете о своей машине ... По крайней мере, я смог увидеть, какие процессы запущены у меня, какие пользователи и прочее ... Гнусно выругавшись (посмотрите, кто рядом ;-) лезем в файлик /etc/inetd.conf и тщательно начинаем смотреть, кто на какой порт откликается, сверяясь с /etc/services на предмет номера порта. Будем максимально параноидальны и оставим только ftp ....

ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  wu.ftpd -l -i -a
telnet (лучше заменить на ssh!!!)....
telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
.... все, ну можете еще оставить finger(finger stream tcp nowait .....) (это он показывает, кто сейчас залогинен в машине, но я и этого не сделал ... все остальное, если не знаете, для чего и кем открыты, лучше закомментировать (не удаляйте, это может впоследствии оказаться нужным )... все, 50% нужного мы сделали ... даем команду kill -HUP [pid_inetd], и смотрим опять, какие порты остались открытыми. Смотрим опять их номера в /etc/services - но тут ничего комментировать не надо - не поможет ;-). Открываем файлик /etc/rc.d/rc.inet2 и аккуратно в самом начале правим строку, начинающуюся на IN_SERV - у меня остался в ней только crond (это "шедулер" ;-) ... потом аккуратно идем дальше и закомментируем символом # следующие сервисы Я напишу начальные строчки блоков, которые Вам нужны ..
Start the SUN RPC Portmapper. - Вы планируете запускать на своей машине удаленные задачи или монтировать NFS ?
Start the NAMED/BIND name server. - у Вас сконфигурирован DNS ?
Start the ROUTEd server. - у Вас в машине стоит несколько сетевых карт, между которыми надо осуществлять динамический роутинг ? ( в 90% достаточно статического)
Start the RWHO server. - Сервер, показывающий кто находится на машинах внутри одной локальной сети, если нет острой необходимости - отключите ...
Setting up NIS: - Аналогично предыдущему.
Start the various SUN RPC servers. - то же самое, что и в первой строке.
... Все, теперь аккуратно kill'ом (kill -9, если не помогает ;-) постреляем ненужные сервисы и опять посмотрим ... что осталось ... отдельно обычно пускаются http-сервер (80 порт, httpd),samba (137,139 порт, smbd,nmbd), socks-сервер ( порт 1080, socks[5]), squid (3128, squid) .. но учтите, что все эти сервисы можно спокойно перенести на другой порт (никто не помешает мне запустить httpd сервер на 20 или 30 портах одновременно в практически любом диапазоне), и то, что многие программы имеют несколько открытых портов (тот же httpd для насильственной перекодировке можно запустить еще на нескольких портах, привязав перекодировку к порту) ... В общем, немного посмотрите, можете аккуратно меня (или своего провайдера;-)) просканировать - увидите, что у меня открыто ... но почти в любом случае стоит обращать внимание на те порты , номер у которых меньше 1024 - на эти порты могут сесть только те программы в момент запуска которых есть полномочия root.
Теперь я порекомендую перезагрузить машину и внимательно рассмотреть сообщения, которые будут появляться при загрузке на предмет ругательств какой-либо программы .... если надо, поправить это ... и все ...

Куда еще нужно смотреть ? регулярно проверять /etc/passwd&/etc/shadow на предмет новых пользователей и ВНИМАНИЕ !! на появление пароля у тех пользователей, у которых раньше стояла * (operator,news,nobody etc).... Также смотреть /etc/group ....ну и вообще присматривать за файликами, лежащими в /etc - права, содержание и все остальное ....

Существует еще один очень простой способ открыть любую линукс-машину. В ответ на приглашение lilo необходимо набрать linux single (ну или boot= ... root=... etc), и Вы получите в свое распоряжение консоль суперпользователя (или ядро, загруженное оттуда, откуда вы захотели). Как от этого избавиться ? Очень просто - пишем всемогущую команду man lilo.conf.

........
password=password
The  per-image  option  `password=...'  (see below)
applies to all images.
........
restricted
The   per-image  option  `restricted'  (see  below)
applies to all images.
........
password=password
Protect the image by a password.
........
restricted
       A password is only required to boot  the  image  if
       parameters  are specified on the command line (e.g.
       single).
........	    
В итоге после перевода что получаем ? Если мы в общей секции lilo.conf добавим два параметра
restricted
password=nizzza_grusit
То при попытке указать в загрузочных параметрах что либо, кроме имени (label) разрешенных ядер, мы получим приглашенние ввести пароль (nizzza_guzit). Если же Вы хотите защитить от случайной загрузки лишь какое-либо из ядер (например, в нем вкомпилены драйвера для очень специфического оборудования или еще какая гадость ;-)), то вам надо просто добавить команду password= в ту секцию lilo.conf, которая описывает параметры загрузки этого ядра.

SSH

SSH (secure shell) - это программа, которая шифрует весь трафик, идущий между двумя машинами (telnet, X11), мощными протоколами шифрования и заодно еще и сжимает его ...Этим убиваются сразу 2 зайца - можно больше не бояться, что кто-то возьмет сниффер и начнет снимать трафик, потом его декодирует и выдерет пароли ....и на медленных каналах из-за сжатия чуть-чуть уменьшается время реакции машины на команды ... в общем, польза со всех сторон.

Для линукса и юниксов вообще все очень просто - все необходимо лежит на www.ssh.fi - там Вы найдете все в куче .... но я брал с ftp.cs.hut.fi/pub/ssh - там тоже дают ;-). Возьмем для примера ssh-1.2.27. На данный момент существуют 2 несовместимые между собой версии протокола ssh. Мне же, кроме походов на свою машину, требуется иногда ходить на другие машины, на которых стоит ssh именно первой версии. Вас же никто не ограничивает в выборе. Установка ssh проста до безобразия - ./configure; make; make install (естественно, последнее надо делать из под пользователя root). После всего в каталоге /etc появятся несколько файликов с именами, начинающимися на ssh*. Нас интересуют ssh_config и sshd_config. В первом находятся настройки для клиента, а во втором для сервера. В принципе, как написано в INSTALL, эти настройки подходят для большинства систем и машин - я посмотрел и действительно ... в итоге я просто просмотрел эти файлики и не стал в них ничего менять. Там же рекомендуют пускать sshd в самом начале загрузки линукса, а не вставлять его вызов через inetd, поскольку при каждом запуске sshd генерирует новый ключ и это занимает довольно значительные ресурсы времени и мощности. Так я и сделал, просто расскоментировал в /etc/rc.d/rc.inet2 одну-единственную строчку c sshd. Сохранил файл и от суперпользователя снова дал эту команду - никто ни на что не сругался ....ps честно показал, что sshd запущен, стал демоном ... telnet localhost 22 сказал, что коннект проходит ... вроде все работает .... надо попробовать теперь клиент ...

bash$ ssh multik
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)? yes
Host 'multik' added to the list of known hosts.
multik@multik's password: 
..............
bash$
Что произошло ? Я попросил SSH-клиента (ssh) присоедениться к хосту с именем multik. Он спросил, уверен ли я, что я знаю этот хост ? (во избежание случайного присоединения к неизвестным машинам), я ответил yes , ввел пароль и получил шифрованный доступ к машине ... все работает. ;-). Осталось единственное, о чем я вас не предупредил - не пытайтесь переименовать ssh во что-нибудь другое ... в файле ssh.c стоит защита на это ....
Назад Дальше
HTML by Igor Drozdovsky
Последнее обновление: