BugTraq стр. 2 gcc kernelptrace.c . /a.out [+] Attached to 24983 [+] Waiting for signal [+] Signal caught [+] Shellcode placed at 0xccfd9ef0 [-] Unable to write shellcode: Input/output error Killed ./a.out [+] Attached to 24986 [+] Waiting for signal [+] Signal caught [+] Shellcode placed at 0xccfd9ef0 [-] Unable to write shellcode: Input/output error Killed ./a.out [+] Attached to 24989 [+] Waiting for signal [+] Signal caught [+] Shellcode placed at 0x4000e8fd [+] Now wait for suid shell... sh-2.05a# RADIUS Всеволод Стахов $./configure $make #make install clients: # В данном файле находится список клиентов (NAS), которые # могут проходить аутентификацию. Клиент проходит проверку # имени и ключа. Файл имеет соответствующую структуру: # поле имени и поле ключа: #Имя клиента Ключ #---------------- ------------------- NAS1 123456789cba NAS2:call 987654321abc proxy: # В этом файле описываются radius-серверы, на которые # данный может перенаправлять запросы NAS. Такое поведение, # например, полезно для организации роуминга. Представим # ситуацию: существует 2 провайдера А и Б, они хотят, чтобы # клиент, заключивший договор с одним из них, мог беспре- # пятственно заходить и на другой. В данном случае в файле # прописывается radius-сервер второго провайдера, на который # будет осуществляться перенаправление. Наличие ключей # позволяет защитить сервера доступа от подмены данных. # Рассматриваемый файл содержит четыре поля: имя сервера, # ключ доступа к серверу (на удалённом сервере необходимо # внести запись в clients, соответствующую серверу, осуще- # ствившему перенаправление), область действия сервера # (т.е. каких клиентов следует перенаправлять на данный # сервер, определяется именем клиента после знака @, на- # пример, user@test.ru), необязательные опции и номера # портов. Доступные опции выглядят следующим образом: old – # удаление области действия и состояния прокси из заголовка # сообщения от NAS, secure – возможность пересылки запросов # на доступ с привилегиями администратора, ipass – # использование протокола ipass (непереводимое слово). rad.test.ru somekey test.ru radius.ru.net papakeyyer com.net 1645 1646 secure users: # Это основной файл, где хранятся данные о пользователях. # Описание идёт так: вначале без отступа имя пользователя, # затем, отступая на табуляцию, идут AV-пары (первой # парой идёт пароль). AV-пары должны описываться в файле # словаря dictionary. Существует также специальный пользо- # ватель по умолчанию, который имеет специальное имя # DEFAULT. Обычно пользователь по умолчанию применяется, # когда описания пользователей находятся не в данном файле, # а в /etc/passwd, но об этом я расскажу далее. Для начала # приведу несколько примеров описания пользователей (для # получения полного списка AV-пар смотрите файл словаря). # Ещё учтите, что имя пользователя может иметь максимум 8 # символов в длину, пароль в принципе до 254 символов, но # я часто слышал про ограничение в 31 символ (честно говоря, # представить себе не могу, когда может понадобиться пароль # длиннее 31 символа!) user1 Password = "testing", Expiration = "Dec 24 1995" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 255.255.255.254, Framed-Routing = None, Filter-Id = "std.ppp", Framed-MTU = 1500, Framed-Compression = Van-Jacobson-TCP-IP user2 Password = "moretest" Service-Type = Login-User, Login-IP-Host = 192.168.2.7, Login-Service = PortMaster user3 Password = "callme" Service-Type = Callback-Login-User, Login-IP-Host = timeshare1, Login-Service = PortMaster, Callback-Number = "1231234" # В конце файла может быть описание пользователя по умол- # чанию DEFAULT. В данном случае используется аутентификация # через пароли в /etc/passwd, для этого применяется дирек- # тива Auth-Type = System. Значение префикса или суффикса # для имени пользователя означает, что производится поиск # данного префикса или суффикса, а остальная часть имени # используется непосредственно как имя пользователя. Это # удобно для добавления различных типов доступа для пользо- # вателя в зависимости от префикса или суффикса. # Рассмотрим пример: # Для пользователей, начинающихся с буквы P (Pusername) # используется сервис PPP DEFAULT Auth-Type = System, Prefix = "P" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 255.255.255.254, Framed-MTU = 1500 # Для префикса S - SLIP DEFAULT Auth-Type = System, Prefix = "S" Service-Type = Framed-User, Framed-Protocol = SLIP, Framed-IP-Address = 255.255.255.254, Framed-Compression = None # Компрессия трафика - префикс C DEFAULT Auth-Type = System, Prefix = "C" Service-Type = Framed-User, Framed-Protocol = SLIP, Framed-IP-Address = 255.255.255.254, Framed-Compression = Van-Jacobson-TCP-IP # Здесь используется суффикс %ppp, сигнализирущий # использование протокола PPP DEFAULT Auth-Type = System, Suffix = "%ppp" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 255.255.255.254, Framed-MTU = 1500 # Для пользователя, не соответствующего другим определениям, # запускаем протокол PPP DEFAULT Auth-Type = System, Framed-Protocol = PPP Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 255.255.255.254, Framed-MTU = 1500 dictionary: # Данный файл содержит описания атрибутов и значений. # Конечно же, я не буду приводить его целиком, приведу # пример только основных AV: ATTRIBUTE имя_атрибута # число_соответствующее_атрибуту тип_атрибута. Число для # атрибута используется как синоним текста, можно написать # Password="text", что идентично 2="text". Тип атрибута # может принимать следующие значения: # string – строка длиной от 0 до 253 символов; # ipaddr – IP-адрес, 4 байта в сетевом порядке; # integer – 32-х битное целое в интеловском порядке байт; # date – 32-х битное число, означающее текущую дату и время; ATTRIBUTE User-Name 1 string ATTRIBUTE Password 2 string ATTRIBUTE Framed-IP-Address 8 ipaddr ATTRIBUTE Expiration 21 date # Описания значений: VALUE имя_значения имя_атрибута номер. # Эти описания обычно служат для установления соответствия # строка-номер. Так, например, значение протокола имеет # числовой вид, но для упрощения составления файла # конфигурации некоторым числам сопоставлены числовые # константы (можно привести аналогию #define MACRO 1 в си): VALUE Service-Type Login-User 1 VALUE Service-Type Framed-User 2 VALUE Service-Type Callback-Login-User 3 VALUE Service-Type Callback-Framed-User 4 VALUE Service-Type Outbound-User 5 VALUE Service-Type Administrative-User 6 VALUE Framed-Protocol PPP 1 VALUE Framed-Protocol SLIP 2 VALUE Framed-Protocol ARAP 3 VALUE Login-Service Telnet 0 VALUE Login-Service Rlogin 1 VALUE Login-Service TCP-Clear 2 VALUE Login-Service PortMaster 3 radiusd.conf # Общая схема файлов конфигурации freeradius позволяет # использовать специальную директиву $INCLUDE для включения # конфигурационных файлов в данный (формат .conf) $INCLUDE ${confdir}/proxy.conf $INCLUDE ${confdir}/clients.conf # Полезно будет указать пользователя и группу, под которыми # будет работать сервер. В принципе лучше, чтобы привилегий # было поменьше. Если же использовать аутентификацию mysql, # то выбор nobody:nobody, на мой взгляд, является самым # наилучшим. user = nobody group = nobody # Максимальное время обработки запроса (в секундах), по # истечении которого клиенту будет послан пакет, сигнали- # зирующий разрыв соединения. max_request_time = 30 # Максимальное количество соединений для данного сервера # получается умножением числа NAS в сети на 256. Например, # для 4 клиентов, значение будет 4*256=1024 max_requests = 1024 # Заносить в лог данные о полном имени пользователя log_stripped_names = yes # Заносить ли в лог информацию о запросах на аутентификацию log_auth = no # Заносить ли в лог данные о переданных паролях # (неправильных и правильных соответственно) log_auth_badpass = yes log_auth_goodpass = no # Приводить ли к нижнему регистру все имена пользователей # и пароли (весьма полезно для некоторых пользователей). # Возможные значения: no – чувствительные к регистру # пароль/имя, before – вначале приводим к нижнему регистру, # потом проводим аутентификацию, after – вначале проверяем # аутентификацию как есть, если не получилось, то приводим # к нижнему регистру и повторяем попытку. lower_user = no lower_pass = no # Убираем пробелы из имени пользователя и пароля. Полезно # для имён и паролей, содержащих пробелы. Возможные # значения аналогичны предыдущему случаю. nospace_user = no nospace_pass = no # Весьма полезные параметры модуля безопасности сервера: security { # Максимальное число AV-пар в пакете. Если число пар # больше, то пакет не обрабатывается. Если указать # данный параметр равным нулю, то будут обрабатываться # любые пакеты. max_attributes = 200 # Пакет отказа доступа может быть отправлен с некоторой # задержкой (в секундах). Такое поведение предотвращает # применение DoS-атаки. Если же указать значение, равное # нулю, то отказ будет посылаться без задержки. reject_delay = 1 # Посылать ответ на запрос NAS о статусе сервера. Такое # поведение не описано в rfc, поэтому по умолчанию – no # (как написано в комментариях, «может пригодиться для # некоторых особых NAS») status_server = no } # Обрабатывать перенаправление запросов. Если перенаправление # отключено, то необходимо отключить файл proxy.conf, дабы # избежать ошибок конфигурации (закомментировать директиву # $INCLUDE ${confdir}/proxy.conf). proxy_requests = yes # Далее следуют описания многочисленных модулей freeradius, # позволяющие настроить, к примеру, методы шифрации паролей # или работу различных аутентификационных протоколов (PAP, # CHAP, MS-CHAP), но описывать здесь всё я не намерен: думаю, # что в примерах все и так очень подробно обьяснено и # разобраться не составит труда. clients.conf # В данном файле описываются клиенты aka NAS. Формат файла # напоминает файл настройки tacacs+. Вначале идёт определение # клиента: client имя_или_ip_адрес, затем идёт список AV-пар # для данного клиента, заключённый в фигурные скобки. Приведу # несколько примеров: client 127.0.0.1 { # Пароль для идентификации клиента и обмена с ним # данными. Данным ключом также осуществляется проверка # неизменности передаваемых пакетов (подпись). secret = some_strange_secret # Краткое имя для клиента. shortname = localhost # Следующие три поля необязательны, но они полезны для # работы скрипта checkrad.pl (проверка работы процессов # сервера) # Поле типа NAS может принимать следующие значения: # Хотя зачем это нужно, я так и не понял. # cisco # computone # livingston # max40xx # multitech # netserver # pathras # patton # portslave # tc # usrhiper # other nastype = other # localhost обычно не является NAS # Две следующие строчки зарезервированы на будущее. # Вообще-то они должны использоваться для проверки # имени пользователя и пароля для данного NAS # login = !root # password = someadminpas } client some.test.ru { secret = some_host_secret shortname = somenas } # Также можно определять пароль для всех клиентов # некоторой подсети (чем меньше подсеть, тем лучше, а # вообще, на мой взгляд, это не есть хорошо из # соображений безопасности) client 192.168.0.0/24 { secret = a_very_long_passwd shortname = private-network } proxy.conf # Данный файл состоит из двух разделов: описание настроек # самого прокси-сервера и описание областей перенаправления. # На конфигурации работы самого прокси-сервера я останав- # ливаться не буду, а сразу же перейду к описанию директивы # определения области realm. Она выглядит следующим образом: # realm имя_области. Имя области должно являться именем # домена, который этой областью описывается. Если вместо # имени области употребляется слово DEFAULT, то в данную # область будут перенаправляться запросы, не соответствующие # ни одному параметру. Поясню это на примерах: realm isp2.ru { # Тип сервера type = radius # Сервер radius для аутентификации authhost = radius.isp2.com:1645 # Сервер radius для аутентификации (обычно другой порт) accthost = radius.isp2.com:1646 # Секрет для связи secret = our_concurents_key # Не убирать суффикс или префикс области из имени пользователя nostrip } # Если перенаправить запрос на данный сервер не удалось, # то происходит выборка другого сервера для данной области # или сервера по умолчанию. Также существует специальная # область NULL для клиентов, которые не определили область # действия, например, просто user (сравните user@isp2.ru) realm NULL { type = radius authhost = radius.test.ru accthost = radius.test.ru secret = our_secret_key } # Ну а для тех пользователей, чья область не определена, # используется сервер по умолчанию: realm DEFAULT { type = radius authhost = radius.test.ru accthost = radius.test.ru secret = our_secret_key } # Учтите: в двух последних примерах при перенаправлении # запроса к вторичным серверам radius из имени пользователя # вырезается имя области, т.к. не определена опция nostrip. DEFAULT Acct-Status-Type == Start Exec-Program = "/path/to/exec/acct/start %U" DEFAULT Acct-Status-Type == Stop Exec-Program = "/path/to/exec/acct/stop %U %n %a" # Здесь директива Strip-User-Name определяет, удалять ли # префикс или суффикс из имени DEFAULT Suffix = ".ppp", Strip-User-Name = Yes Hint = "PPP", Service-Type = Framed-User, Framed-Protocol = PPP DEFAULT Prefix = "P", Strip-User-Name = Yes Hint = "PPP", Service-Type = Framed-User, Framed-Protocol = PPP user Auth-Type := Local, User-Password == "testing" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 172.16.3.33, Framed-IP-Netmask = 255.255.255.0, Framed-Routing = Broadcast-Listen, Framed-MTU = 1500, Framed-Compression = Van-Jacobsen-TCP-IP $mysql -uroot -proot_passwd mysql> create database radius $cd {PATH_TO_RADIUS_SRC}/src/modules/rlm_sql/drivers rlm_sql_mysql $mysql -uroot -proot_passwd radius < db_mysql.sql modules { # Включение файла для работы с mysql, для работы # с другими СУБД используются файлы # Postgresql: ${confdir}/postgresql.conf # MS-SQL: ${confdir}/mssql.conf $INCLUDE ${confdir}/sql.conf } authorize { preprocess chap mschap suffix files sql ldap } authenticate { authtype my_dialup { pap chap ldap } } sql { # Тип базы данных driver = "rlm_sql_mysql" # Параметры соединения server = "localhost" login = "root" password = "mysql_passwd" # База данных, используемая radius radius_db = "radius" # Первая таблица хранит записи начала соединения (start), # вторая – записи окончания соединения (stop). Если они # совпадают, то хранятся в одной таблице. acct_table1 = "radacct" acct_table2 = "radacct" # Таблица авторизации и установки типа аутентификации authcheck_table = "radcheck" authreply_table = "radreply" # Групповые таблицы groupcheck_table = "radgroupcheck" groupreply_table = "radgroupreply" # Соответствие пользователей группам usergroup_table = "usergroup" # Remove stale session if checkrad does not see a # double login deletestalesessions = yes # Все sql-запросы выводятся в режиме отладки radiusd -x sqltrace = yes sqltracefile = /usr/local/var/log/radius/sqltrace.sql # Количество соединений с сервером. При большой загрузке # рекомендуется увеличить. num_sql_socks = 5 # Число секунд, перед тем как сервер предпринимает # повторную попытку соединения, если произошёл сбой # соединения с mysql. connect_failure_retry_delay = 60 radtest user_name password radius_server nas_port secret $radtest testuser testing radius.test.ru 1 radius_secret ldap { server = "ldap.test.ru" # Этот пользователь должен иметь право читать пароли, # поэтому необходимо добавить соответствующий acl в файл # конфигурации ldap-сервера (об этом рассказано в моей # статье «OpenLDAP». – журнал # «Системный администратор». – 2003, №2(3). с.74-84.) identity = "cn=proxy,dc=test,dc=ru" password = mypass basedn = "o=test,c=ru" filter = "(uid=%{Stripped-User-Name:-%{User-Name}})" # Включаем безопасное соединение, не меняя порт start_tls = yes # Бог знает что, но вроде это заставляет шифровать # данные при запросе к серверу tls_mode = yes # В данной ветви хранятся профили пользователей default_profile = "cn=radprofile,ou=dialup,dc=test,dc=ru" # profile_attribute = "radiusProfileDn" access_attr = "dialupAccess" # В данном атрибуте предполагается хранение пароля # пользователя password_attribute = "userPassword" # Атрибуты для перевода формата значений ldap => radius dictionary_mapping = ${raddbdir}/ldap.attrmap # Остальная часть убрана, т.к. не заслуживает отдельного # внимания } accounting { # Данный модуль используется для создания уникального # идентификатора пакета аккаунтинга, т.к. это требуют # многие NAS, поэтому этот модуль обычно необходимо включать acct_unique # Данный модуль позволяет создавать каждый час файл с # информацией о пользователе. Файлы создаются по умолчанию # в формате #detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d # detail # Модуль счетчика - заслуживает отдельного разговора # counter # Стандартный wtmp-формат # unix # utmp-файл, содержащий имена пользователей и порты NAS # radutmp # utmp файл, не содержащий имён пользователей, поэтому # доступный всем для чтения # sradutmp # Модуль аккаунтинга через sql sql } # Для записей о начале сессии acct_table1 = "radacct" # Для записей о конце сессии acct_table2 = "radacct" # Счётчик общего времени sqlcounter noresetcounter { counter-name = Max-All-Session-Time # Проверка определённого атрибута в таблице radcheck check-name = Max-All-Session # Используемый процесс sql sqlmod-inst = sql # Поле, по которому происходит расчёт времени key = User-Name # Сброс счётчика, в данном случае счётчик не сбрасывается reset = never # SQL-запрос, выполняемый счётчиком query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'" } # Счетчик сбрасывается ежедневно sqlcounter dailycounter { driver = "rlm_sqlcounter" counter-name = Daily-Session-Time check-name = Max-Daily-Session sqlmod-inst = sql key = User-Name # Сброс счётчика ежедневно reset = daily query = "SELECT SUM(AcctSessionTime - GREATEST ((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'" } sqlcounter monthlycounter { counter-name = Monthly-Session-Time check-name = Max-Monthly-Session sqlmod-inst = sql key = User-Name reset = monthly query = "SELECT SUM(AcctSessionTime - GREATEST ((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'" } modules { $INCLUDE ${confdir}/sqlcounter.conf authorize { ... noresetcounter dailycounter monthlycounter } test1 Max-All-Session := 54000, User-Password == "" Service-Type = Framed-User, Framed-Protocol = PPP > INSERT into radcheck VALUES ('','test1','Max-All-Session',':=','54000'); # configure terminal # aaa new-model # ip radius source-interface Ethernet0 # radius-server host {hostname | ip-address} [auth-port port-number] [acct-port port-number] [timeout seconds] [retransmit retries] [key string] # aaa authorization network radius # aaa authorization exec radius # aaa authentication login radius_auth local radius # aaa authentication ppp ppp_auth radius # line [console | tty | vty] line-number [ending-line-number] (line)# login authentication radius_auth (line)# exit # interface async 6 (interface)# ppp authentication {chap | pap} ppp_auth (interface)# exit # aaa accounting network start-stop radius # aaa accounting connection start-stop radius # aaa accounting update periodic 1 FAQ Shell стр.13 Всеволод Стахов ./some_prog RESULT=$? ./some_prog if [ $? ne 0 ] then echo Bad exit code exit fi echo Error!!! exit $? DATE=`date` cat > cfg < 192.168.0.3 netmask 0xffffffff Opened by PID 1143 tun1: flags=8051 mtu 1450 inet6 fe80::280:48ff:fedf:66f7%tun1 prefixlen 64 scopeid 0x9 inet 192.168.0.2 --> 192.168.0.1 netmask 0xffffffff Opened by PID 1150 vpn_shop# ifconfig -a lo0: flags=849 mtu 8232 inet 127.0.0.1 netmask ff000000 le0: flags=863 mtu 1500 inet 192.168.40.251 netmask ffffff00 broadcast 192.168.40.255 ether 00:80:48:b6:43:5f le1: flags=863 mtu 1500 inet 80.80.20.3 netmask ffffff00 broadcast 80.80.20.255 ether 00:02:b3:65:0f:47 tun0: flags=8d1 mtu 1500 inet 192.168.0.3 --> 192.168.0.2 netmask ffffffff ether 0:0:0:0:0:0 vpn_filial# /sbin/ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:13072 errors:0 dropped:0 overruns:0 frame:0 TX packets:23921 errors:0 dropped:0 overruns:0 carrier:0 Collisions:0 eth0 Link encap:Ethernet HWaddr 00:80:48:c7:c7:9b inet addr:192.168.20.251 Bcast:192.168.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:78 errors:0 dropped:0 overruns:0 frame:10 TX packets:13 errors:0 dropped:0 overruns:0 carrier:0 Collisions:0 Interrupt:3 eth1 Link encap:Ethernet HWaddr 00:02:2e:f1:17:26 inet addr:80.80.20.1 Bcast:80.80.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:49 errors:1 dropped:0 overruns:0 frame:15 TX packets:22 errors:0 dropped:0 overruns:0 carrier:0 Collisions:1 Interrupt:4 tun0: Link encap:Point-to-Point Protocol inet addr:192.168.0.1 P-t-P: 192.168.0.2 Mask:255.255.255.0 UP POINTPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:155 errors:0 dropped:0 overruns:0 frame:15 TX packets:162 errors:0 dropped:0 overruns:0 carrier:0 Collisions:0 vpn_filial# ping 192.168.30.251 PING 192.168.30.251 (192.168.30.251): 56 data bytes 64 bytes from 192.168.30.251: icmp_seq=0 ttl=64 time=5.788 ms 64 bytes from 192.168.30.251: icmp_seq=1 ttl=64 time=5.724 ms 64 bytes from 192.168.30.251: icmp_seq=2 ttl=64 time=5.683 ms 64 bytes from 192.168.30.251: icmp_seq=3 ttl=64 time=5.685 ms --- 192.168.30.251 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 5.683/5.720/5.788 ms vpn_office# ping 192.168.40.251 PING 192.168.30.251 (192.168.30.251): 56 data bytes 64 bytes from 192.168.40.251: icmp_seq=0 ttl=64 time=6.092 ms 64 bytes from 192.168.40.251: icmp_seq=1 ttl=64 time=5.785 ms 64 bytes from 192.168.40.251: icmp_seq=2 ttl=64 time=5.851 ms 64 bytes from 192.168.40.251: icmp_seq=3 ttl=64 time=5.826 ms --- 192.168.30.251 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 5.785/5.888/6.092/0.120 ms vpn_office# tcpdump -i tun0 -lenx 13:33:14.573619 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp: echo request 4500 0054 0cc3 0000 4001 c398 c0a8 0002 c0a8 28fb 0800 edcc c904 0000 ede7 cc3d 9505 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 13:33:14.573665 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp: echo reply 4500 0054 1b3f 0000 4001 b51c c0a8 28fb c0a8 0002 0000 f5cc c904 0000 ede7 cc3d 9505 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 13:33:15.583143 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp: echo request 4500 0054 0cc6 0000 4001 c395 c0a8 0002 c0a8 28fb 0800 42a6 c904 0100 eee7 cc3d 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 13:33:15.583194 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp: echo reply 4500 0054 1b43 0000 4001 b518 c0a8 28fb c0a8 0002 0000 4aa6 c904 0100 eee7 cc3d 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 13:33:16.590000 AF 2 84: 192.168.0.2 > 192.168.40.251: icmp: echo request 4500 0054 0cc6 0000 4001 c395 c0a8 0002 c0a8 28fb 0800 42a6 c904 0100 eee7 cc3d 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 13:33:16.590120 AF 2 84: 192.168.40.251 > 192.168.0.2: icmp: echo reply 4500 0054 1b43 0000 4001 b518 c0a8 28fb c0a8 0002 0000 4aa6 c904 0100 eee7 cc3d 3e2c 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 vpn_office# tcpdump -i ed1 -lenx 13:33:14.573441 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: 80.80.20.2.5000 > 80.80.20.3.1035: udp 98 4500 007e 0cc4 0000 4011 a506 5050 1402 5050 1403 1388 040b 006a f9e2 0060 7db0 f6ef dd81 4638 917a 5a80 7f48 87d7 7bc9 459f 97f0 b95a 95cf 87b1 29ce b2d7 8f50 228e 6b8f eafb 1f5d ae9d 7518 2085 2da9 8c85 13:33:14.574798 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: 80.80.20.3.1035 > 80.80.20.2.5000: udp 98 4500 007e 1b40 0000 4011 968a 5050 1403 5050 1402 040b 1388 006a 998c 0060 7db0 f6ef dd81 4638 5390 c84e 886e 466d ffcd df10 9010 5995 fcdd b315 92fb 6a1d 8f50 228e 6b8f eafb 1f5d ae9d 7518 2085 2da9 8c85 13:33:15.582910 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: 80.80.20.2.5000 > 80.80.20.3.1035: udp 98 4500 007e 0cc7 0000 4011 a503 5050 1402 5050 1403 1388 040b 006a 28fd 0060 7db0 f6ef dd81 4638 3048 4e92 e692 1c3d 5fa3 c2a6 bc50 8fa5 79d3 c0c2 6537 c74b 1e84 b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 8c85 13:33:15.584332 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: 80.80.20.3.1035 > 80.80.20.2.5000: udp 98 4500 007e 1b44 0000 4011 9686 5050 1403 5050 1402 040b 1388 006a cd92 0060 7db0 f6ef dd81 4638 f41d cb55 f37d 1229 dbb6 14f7 14d1 08e3 a204 5045 74a0 7807 1e84 b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 8c85 13:33:15.593910 0:40:95:45:9c:e2 0:2:b3:65:f:47 0800 140: 80.80.20.2.5000 > 80.80.20.3.1035: udp 98 4500 007e 0cc7 0000 4011 a503 5050 1402 5050 1403 1388 040b 006a 28fd 0060 7db0 f6ef dd81 4638 3048 4e92 e692 1c3d 5fa3 c2a6 bc50 8fa5 79d3 c0c2 6537 c74b 1e84 b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 8c85 13:33:15.594237 0:2:b3:65:f:47 0:40:95:45:9c:e2 0800 140: 80.80.20.3.1035 > 80.80.20.2.5000: udp 98 4500 007e 1b44 0000 4011 9686 5050 1403 5050 1402 040b 1388 006a cd92 0060 7db0 f6ef dd81 4638 f41d cb55 f37d 1229 dbb6 14f7 14d1 08e3 a204 5045 74a0 7807 1e84 b95e c8f8 6048 3d3c 4f33 32a4 25a2 2da9 8c85 filial_to_shop { pass secret; type tun; proto udp; encr yes; keepalive yes; up { ifconfig "%% 192.168.0.3 netmask 255.255.255.0 192.168.0.1 up"; route "add net 192.168.20.0 192.168.0.1 1"; }; down { ifconfig "%% down"; route "delete net 192.168.20.0 192.168.0.1 1"; }; vpn_shop# vtund -s filial_to_shop { pass secret; type tun; proto udp; encr yes; keepalive yes; up { ifconfig "%% 192.168.0.1 pointopoint 192.168.0.3 mtu 1450"; route "add -net 192.168.30.0/24 192.168.0.3"; }; down { ifconfig "%% down"; route "delete -net 192.168.30.0 "; }; vpn_shop# vtund -p filial_to_shop 80.80.20.1 НАСТРОЙКА INCOMING CONNECTIONS В LINUX Сергей Ропчан mgetty -D -s 38400 -n 4 ttyS1 s1:2345:respawn:/sbin/mgetty -D -s 38400 -n 4 ttyS1 /AutoPPP/ — ppp /usr/sbin/pppd auth -chap +pap login modem crtscts lock proxyarp #Secrets for authentication using PAP #client server secret IP addresses dialup * qwerty 192.168.1.254 00 — 01 09/23 14:34:28 yS1 mgetty: experimental test release 1.1.26-Apr16 02 09/23 14:34:28 yS1 check for lockfiles 03 09/23 14:34:28 yS1 locking the line 04 09/23 14:34:28 yS1 lowering DTR to reset Modem 05 09/23 14:34:29 yS1 send: \dATQ0V1H0[0d] 06 09/23 14:34:29 yS1 waiting for «OK» ** found ** 07 09/23 14:34:30 yS1 send: ATS0=0Q0&D3&C1[0d] 08 09/23 14:34:30 yS1 waiting for «OK» ** found ** 09 09/23 14:34:30 yS1 waiting... 10 09/23 14:35:25 yS1 wfr: waiting for «RING» 11 09/23 14:35:25 yS1 wfr: waiting for «RING» 12 09/23 14:35:30 yS1 wfr: waiting for «RING» 13 09/23 14:35:35 yS1 wfr: waiting for «RING» 14 09/23 14:35:40 yS1 send: ATA[0d] 15 09/23 14:35:40 yS1 waiting for «CONNECT» ** found ** 16 09/23 14:35:59 yS1 send: 17 09/23 14:35:59 yS1 waiting for «_» ** found ** 18 09/23 14:36:01 yS1 clean_line: only 500 of 5277 bytes logged 19 09/23 14:36:11 yS1 login.config: max. 9 command line arguments possible 20 09/23 14:36:11 ##### data dev=ttyS1, pid=2307, caller=’none’, conn=’38400/V.34 28800/None’, name=’’, cmd=’/usr/sbin/pppd’, user=’/AutoPPP/’ Борьба за системные ресурсы Денис Колисниченко # make dep # make bzImage # make modules # make modules_install # make install image=/usr/src/linux/arch/i386/boot/bzImage label=my_linux # Параметры root и mem у вас, скорее всего, будут другими root=/dev/hda1 append=" mem=256M" read-only service ftp { socket_type = stream wait = no user = root server = /usr/etc/in.ftpd server_args = -l instances = 4 log_on_success += DURATION USERID log_on_failure += USERID # Время работы сервиса access_times = 8:00-12:00 13:00-18:00 nice = 10 } dd if=/dev/zero of=/swap bs=1k count=131072 mkswap /swap 131072 swapon /swap # hdparm - d1m2c3u1 /dev/hda # hdparm /dev/hda # hdparm –t /dev/hda # hdparm -k1 /dev/hda delay_class 1 1 # определяет первый пул класса 1 для домашних пользователей delay_class 2 2 # определяет второй пул класса 2 для служащих acl home src адреса acl workers src адреса delay_access 1 allow home delay_access 1 deny all delay_access 2 allow workers delay_access 2 deny all delay_parameters 1 14400/14400 delay_parameters 2 33600/33600 16800/33600 localhost.localdomain RELAY localhost RELAY 127.0.0.1 OK spammer@spam.ru REJECT spamworld.com ERROR:"550 Access denied" 192.168.1 RELAY host.mydomain.ru REJECT mydomain.ru RELAY # makemap hash /etc/mail/access < /etc/mail/access ftp:our_domain.firma.ru DenyAll AllowUser pupkin MaxClients 5 Deny from 153.111.171.137 Deny from 192.168.2. -:ALL EXCEPT den user serge:LOCAL .microsoft.com +:reboot shutdown:LOCAL +:root:tty1 -:root:LOCAL -:den user serge:LOCAL EXCEPT host1 -:root:ALL pam_console_apply -r user soft nproc 50 user hard nproc 60 @dialup1 - maxlogins 14 @dialup2 - maxlogins 14 Система фильтраци иинтернет-трафика Андрей Бешков acl porno src "/usr/local/squid/etc/porno.lst" acl erotic src "/usr/local/squid/etc/erotic.lst" # tar zxvf squid-2.5.STABLE1-src.tar.gz # cd squid-2.5.STABLE1 # ./configure # gmake # gmake install # Обрабатывать запросы на порт 3128 http_port 3128 hierarchy_stoplist cgi-bin ? # Запрещаем кешировать CGI acl QUERY urlpath_regex cgi-bin \? no_cache deny QUERY # Размер оперативной памяти, отводимой под кеш cache_mem 64 MB # Тут мы будем брать файлы стандартных сообщений об ошибках error_directory /usr/local/squid/share/errors/Russian-koi8-r # Максимальный размер объекта, записываемого в кеш maximum_object_size 16384 KB # Здесь у нас будет храниться кеш. Отводим под него 5000 Мб. # Приказываем создать 16 директорий первого уровня и 256 # второго уровня. cache_dir ufs /usr/local/squid/cache 5000 16 256 # Протокол доступа к кешу cache_access_log /usr/local/squid/logs/access.log # Тут находится протокол работы кеша cache_log /usr/local/squid/logs/cache.log # Протокол работы менеджера кеша cache_store_log /usr/local/squid/logs/store.log # Под этим пользователем будем ходить по Ftp ftp_user vasa@pupkin.ru # Если Squid уже скачал 60% файла, а пользователь отказался # его забирать, то все равно продолжать скачивать файл. quick_abort_pct 60 # Время жизни запросов, завершившихся ошибкой. Например, # «connection refused» или «404 Not Found» negative_ttl 1 minutes # Время жизни успешного DNS-запроса. positive_dns_ttl 6 hours # Время жизни DNS-запросов, завершившихся ошибкой. negative_dns_ttl 5 minutes # Поддержка нестандартных http-клиентов half_closed_clients on # Минимальные рекомендуемые права acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 # Ssl acl SSL_ports port 443 563 # http acl Safe_ports port 80 # ftp acl Safe_ports port 21 # https, snews acl Safe_ports port 443 563 # gopher acl Safe_ports port 70 # wais acl Safe_ports port 210 # unregistered ports acl Safe_ports port 1025-65535 # http-mgmt acl Safe_ports port 280 # gss-http acl Safe_ports port 488 # filemaker acl Safe_ports port 591 # multiling http acl Safe_ports port 777 acl CONNECT method CONNECT # описываем наших пользователей acl users src "/usr/local/squid/etc/users.txt" # Разрешаем соединения только по правильным портам. И раздаем # всем права доступа http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access allow users http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access deny all # Адрес пользователя, которого будут уведомлять # о переполнении кеша cache_mgr root@test.ru # Пользователь, от имени которого будет работать Squid cache_effective_user nobody # Группа, от имени которой будет работать Squid cache_effective_group nogroup # Включать ли IP-адрес клиента в заголовок http-запроса forwarded_for on # Разрешаем управлять кешем с помощью cachemgr.cgi. # В качестве пароля будем использовать слово «passwd» cachemgr_passwd passwd all # Включаем сбор статистики по каждому клиенту client_db on #Петрова Наталья (Снабжение) 192.168.10.91/32 #Иванов Владимир (Доставка) 192.168.10.92/32 #Сергеев Игорь (Плановый отдел) 192.168.10.93/255.255.255.255 #Кривоухина Ирина (Лаборатория) 192.168.10.94/255.255.255.255 #Синицына Светлана (секретарь генерального директора) 192.168.10.95/255.255.255.255 # chown nobody:nogroup /usr/local/squid/etc/users.txt acl users src "/usr/local/squid/etc/users.txt" http_access allow users http_access deny all http_access allow all # mkdir /usr/local/squid/cache # mkdir /usr/local/squid/logs # cat /usr/local/squid/etc/squid.conf | grep cache_effectiv cache_effective_user nobody сache_effective_group nogroup # chown -R nobody /usr/local/squid/cache /usr/local/squid/logs # /usr/local/squid/sbin/squid -z # /usr/local/squid/sbin/squid -D # tail -f /var/log/messages Oct 3 12:15:05 dns squid[139]: Squid Parent: child process 141 started # tar zxvf apache_1.3.27rusPL30.16.tar.gz # ./configure # gmake # gmake instal /usr/local/apache/bin/apachectl start # mkdir /usr/local/apache/htdocs/replace # chown nobody:wheel /usr/local/apache/cgi-bin/block.cgi # chmod 500 /usr/local/apache/cgi-bin/block.cgi # tar zxvf libtool-1.3.4.tar.gz # cd libtool-1.3.4 # ./configure # gmake # gmake install # tar zxvf db-3.2.9.tar.gz # cp patch.3.2.9.1 patch.3.2.9.2 ./db-3.2.9 # cd /usr/local/src/db-3.2.9 # patch -p0 < patch.3.2.9.1 # patch -p0 < patch.3.2.9.2 # cd build_unix # ../dist/configure # gmake # gmake install # tar zxvf squidGuard-1.2.0.tar.gz # cd squidGuard-1.2.0 # ./configure --prefix=/usr/local/squidGuard --with-db=/usr/local/BerkeleyDB.3.2 --with-sg-config=/usr/local/squidGuard/squidGuard.conf --with-sg-logdir=/usr/local/squidGuard/log --with-sg-dbhome=/usr/local/squidGuard/db # gmake # gmake test # gmake install # mkdir /usr/local/squidGuard/log # tar zxvf blacklists.tgz -C /usr/local/squidGuard # mv /usr/local/squidGuard/blacklists /usr/local/squidGuard/db domains.20020825.diff domains.20020901.diff domains.20020908.diff domains.20020915.diff domains.20020922.diff +xratedpornsite.com +209.51.157.43 -zena.cenhost.com -scuzz.xtac.com urls.20020825.diff urls.20020901.diff urls.20020908.diff urls.20020915.diff urls.20020922.diff -silva.org/look_at_me +recom.it/fuck/beatrice # squidGuard -u # тут у нас лежат логи logdir /usr/local/squidGuard/log # здесь базы dbhome /usr/local/squidGuard/db # описываем адреса отдела ИТ src it-department { ip 192.168.10.222-192.168.10.223 } # отдел доставки src dostavka { ip 192.168.10.101, 192.168.10.104 } # отдел снабжения src snab { ip 192.168.10.105 } # говорим, что все обращения к файлам *.mp3 нужно перенап- # равить на http://192.168.10.9/replace/my.mp3 rewrite mp3 { s@.*\.mp3$@http://192.168.10.9/replace/my.mp3@r # и запротоколировать это событие в файле # /usr/local/squidGuard/log/rewr_mp3 log rewr_mp3 } # описываем базу порносайтов dest porn { domainlist porn/domains urllist porn/urls # записать протокол в файл /usr/local/squidGuard/log/porn log porn } # описываем базу рекламы dest ads { domainlist ads/domains urllist ads/urls # записать протокол в файл /usr/local/squidGuard/log/ads log ads # подменяем все баннеры прозрачным изображением размером # 1x1 пиксель redirect http://192.168.10.9/replace/1x1.gif } # описываем свою собственную базу баннерных систем dest banners { domainlist banners/domains # в этом файле записаны выражения типа baner, banner, ads, # show_ads expressionlist banners/expressions urllist banners/urls # перенаправляем все запросы на прозрачный gif размером # 1x1 пиксель redirect http://192.168.10.9/replace/1x1.gif log banners } # описываем домены, которые никогда не должны блокироваться # вне зависимости от списка скачиваемого из сети dest local-ok { domainlist local-ok/domains urllist local-ok/urls } # описываем домены, которые должны быть заблокированы всегда # вне зависимости от списка скачиваемого из сети dest local-block { domainlist local-block/domains urllist local-block/urls # и перенаправляем все запросы на block.cgi redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u } # начинаем раздавать права acl { # отделу ИТ можно все, кроме рекламы it-department { pass local-ok !banners !ads all } dostavka { pass local-ok !porn !banners !ads !local-block all redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u rewrite mp3 } # отделу снабжения разрешаем только то, что определено # в local-ok snab { # так можно дать пользователю доступ только к избранным # сайтам pass local-ok none redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=%t&url=%u rewrite mp3 } # действия, выполняемые по умолчанию, если пользователь # не описан ни в одном src default { # блокируем все pass none redirect http://192.168.10.9/cgi-bin/block.cgi?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&targetgroup=Not_Authorized&url=%u # пишем логи в файл /usr/local/squidGuard/log/default log default } # закрываем список acl } # chown -R nobody /usr/local/squidGuard/log/usr/local/squidGuard/db # chown nobody /usr/local/squidGuard/squidGuard.conf # cat > /usr/local/squidGuard/bin/rebuid_base.sh #!/bin/sh /usr/local/squidGuard/bin/squidGuard -C all chown -R nobody /usr/local/squidGuard/db killall -HUP squid ^D # chmod 100 /usr/local/squidGuard/bin/rebuid_base.sh # /usr/local/squidGuard/bin/rebuid_base.sh # если ни один из экземпляров squidGuard не отвечает, то # работать напрямую redirector_bypass on # где находится squidGuard redirect_program /usr/local/squidGuard/bin/squidGuard # сколько экземрляров squidGuard запускать redirect_children 1 # killall -HUP squid 2002-10-15 16:11:04 [10653] squidGuard 1.2.0 started (1034683864.337) 2002-10-15 16:11:04 [10653] squidGuard ready for requests (1034683864.353) # cat > /usr/local/etc/rc.d/apache.sh #!/bin/sh /usr/local/apache/bin/apachectl start ^D # cat > /usr/local/etc/rc.d/squid.sh #!/bin/sh /usr/local/squid/bin/squid -D ^D # chmod 100 /usr/local/etc/rc.d/apache.sh/usr/local/etc/rc.d/squid.sh # tar zxvf wget-1.8.2.tar.gz # cd wget-1.8.2 # ./configure # gmake # gmake install Смотрим, куда он у нас установился. # where wget #cat > /usr/local/squidGuard/bin/update_blacklist.sh #!/bin/sh /usr/local/bin/wget -q --cache=off 'http://squidguard.mesd.k12.or.us/blacklists.tgz' -O /usr/local/squidGuard/update/blacklist.tgz tar zxvf /usr/local/squidGuard/update/blacklist.tgz -C /usr/local/squidGuard/update/ cp -R -f /usr/local/squidGuard/update/blacklists/*/usr/local/squidGuard/bd rm -R /usr/local/squidGuard/update/blacklists /usr/local/squidGuard/rebuid_base.sh ^D # chmod 100 /usr/local/squidGuard/bin/update_blacklist.sh # mkdir /usr/local/squidGuard/update # crontab -e -u root MAILTO="admin@test.ru" 1 0 * * 7 /usr/local/squidGuard/bin/update_blacklist.sh FAQ Shell стр.37 Всеволод Стахов spawn /usr/bin/ftp ftp.myhost.ru expect{ "Name*: " {send "username\r"} "Password:" {send "user_password\r"} "failed" {puts "Can`t login."; exit 1} } send "lcd /etc\r" expect "ftp> " {send "cd /pub/etc\r"} expect "ftp> " {send "get passwd\r"} expect "ftp> " {send "quit\r"} exit 0хо case $- in *i*) # интерактивный режим ;; *) # неинтерактивный режим ;; esac if(! $?prompt) # неинтерактивная оболочка exit else # интерактивная оболочка echo Hi exit endif sh: mpg123 ./*.mp3 > /dev/null 2>&1 csh: mpg123 ./*.mp3 > /dev/null) >& /dev/null #!/bin/sh kill $1 `ps ax | grep $2 | awk '{print $1}'| sed 's/\n/ /g'` killall -9 ftpd #/bin/sh for i in `awk -F: '{if($3 == "0" && $1 != "root") print $1}' /etc/passwd` do mail -s "Strange user!" root@mymail.net << EOT There is a user ${i} that has uid = 0 `date` EOT done Установка и настройка сервера Jabber на платформе Linux Сергей Индлин OPENSSL=/usr/bin/openssl ## This generates the cert and key ## The key will be valid for 3650 days. ## Be sure to enter the FQDN of your Jabber ## server as the «Common Name». $OPENSSL req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out key.pem ## This will remove the passphrase $OPENSSL rsa -in privkey.pem -out privkey.pem ## Put it all together cat privkey.pem >> key.pem ## Cleanup rm privkey.pem /usr/local/jabber/jit/jabber -H /usr/local/jabber/jit/ -c /usr/local/jabber/jit/jabber-icq.xml FAQ Shell стр.41 Всеволод Стахов while read line do echo $line done while read line do echo $line done < /etc/passwd Разводной мост на Linux (Bridging Firewalls) Павел Закляков # route add -host x.x.x.1 dev eth0 # route add -host x.x.x.2 dev eth0 # route add -host x.x.x.3 dev eth1 # route add -host x.x.x.4 dev eth1 # route add -host x.x.x.5 dev eth1 .. # route add -host x.x.x.y dev eth1 # route add default gw x.x.x.1 # echo 200 mytable >> /etc/iproute2/rt_tables # ip rule add from x.x.x.1 dev eth0 table mytable ... # ip route add default via x.x.x.1 dev eth0 table mytable # ip route flush cache # top # patch -p0 -E <файл_с_патчем # patch -p1 -E <файл_с_патчем # make menuconfig # make dep # make clean # make bzImage # lilo # make modules # make modules_install # rpm -i bridge-utils-0.9.6-1.i386.rpm # rpm -ihv bridge-utils-0.9.6-1.i386.rpm # brctl addbr bridge0 # brctl addif bridge0 eth0 # brctl addif bridge0 eth0 # brctl --help # ifconfig eth0 0.0.0.0 promisc # ifconfig eth1 0.0.0.0 promisc # ifconfig mybridge x.x.x.2 netmask 255.255.y.y broadcast x.x.x.z up #! /bin/bash # # chkconfig: 2345 11 89 # мой скрипт моста return=$rc_done case "$1" in start) echo "Starting service bridge bridge0" brctl addbr bridge0 || return=$rc_failed brctl addif bridge0 eth0 || return=$rc_failed brctl addif bridge0 eth1 || return=$rc_failed ifconfig eth0 0.0.0.0 promisc || return=$rc_failed ifconfig eth1 0.0.0.0 promisc || return=$rc_failed brctl sethello bridge0 1 || return=$rc_failed brctl setmaxage bridge0 4 || return=$rc_failed brctl setfd bridge0 4 || return=$rc_failed ifconfig bridge0 promisc up || return=$rc_failed # ifconfig bridge0 x.x.x.x netmask 255.255.x.x broadcast x.x.x.x up || return=$rc_failed # route add default gw z.z.z.z || return=$rc_failed arp -f || return=$rc_failed echo -e "$return" ;; stop) echo "Shutting down service bridge bridge0" # route del default gw z.z.z.z || return=$rc_failed brctl delif bridge0 eth0 || return=$rc_failed brctl delif bridge0 eth1 || return=$rc_failed ifconfig bridge0 down brctl delbr bridge0 || return=$rc_failed echo -e "$return" ;; status) ifconfig bridge0 brctl show bridge0 ;; restart) $0 stop || return=$rc_failed $0 start || return=$rc_failed ;; *) echo "Usage: $0 {start|stop|status|restart}" exit 1 esac test "$return" = "$rc_done" || exit 1 exit 0 #ifconfig bridge0 promisc up || return=$rc_failed #ifconfig bridge0 x.x.x.x netmask 255.255.x.x broadcast x.x.x.x up || return=$rc_failed #route add default gw z.z.z.z || return=$rc_failed #route del default gw z.z.z.z || return=$rc_failed # chkconfig bridge on # ln -s ../init.d/bridge K89bridge # ln -s ../init.d/bridge S11bridge iptables -t nat -A PREROUTING -i eth1 -p tcp -d 0/0 --dport 80 -j REDIRECT --to-ports 3128 (ipchains -A input -i eth1 -p tcp -d 0/0 80 -j REDIRECT 3128 ) # divert on eth1 proto tcp add dst 80 # divert on eth1 enable # make #!/bin/bash echo "Starting firewalling, setting rules..." # чтобы наш процесс не запускался молча, выведем информацию # Укажем переменные, которые нам пригодятся. SERVER_IP="x.x.x.2" PRIVPORTS="0:1023" UNPRIVPORTS="1024:65535" TRACEROUTE_SRC_PORTS="32769:65535" TRACEROUTE_DST_PORTS="33434:33523" CLASS_A="10.0.0.0/8" CLASS_B="172.16.0.0/12" CLASS_C="192.168.0.0/16" OUR_NET="x.x.x.??/??" OUR_BROADCAST="x.x.x.???" # Здесь указываем IP и MAC компьютеров в нашей сети COMPUTER1_IP="x.x.x.3" COMPUTER1_MAC="XX:XX:XX:XX:XX:XX" COMPUTER2_IP="x.x.x.4" COMPUTER2_MAC="XX:XX:XX:XX:XX:XX" COMPUTER3_IP="x.x.x.5" COMPUTER3_MAC="XX:XX:XX:XX:XX:XX" COMPUTER4_IP="x.x.x.6" COMPUTER4_MAC="XX:XX:XX:XX:XX:XX" ... # Сбрасываем все правила. iptables -F # Устанавливаем на всех цепочках политику # по умолчанию – всё запрещено. iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # При необходимости следует повторить всё то же самое для # дополнительных таблиц, если они используются, например, # iptables -t mangle -F # Правила для loopback, разрешить прохождение пакетов # по интерфейсу обратной петли iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Выкидывать все пакеты, которые имеют адрес интерфейса # обратной петли и попадают к нам из других интерфейсов, # отличающихся от lo. При работе это правило не использу- # ется, скорее оно служит защитой «от дурака» или «умного # взломщика». iptables -A INPUT -d 127.0.0.1/8 -i ! lo -j DROP # считаем весь приходящий трафик на адрес сервера $SERVER_IP iptables -A INPUT -p tcp -i bridge0 -d $SERVER_IP # Запрещаем «плохим» пакетам прохождение через мост, чтобы они # не попадали на компьютеры за мостом. Делаем запись в логах. # При нормальной работе сети таких пакетов быть не должно. iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS: " iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN: " iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST: " iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags SYN,RST SYN,RST -j DROP # То же самое, но запрещаем «плохим» пакетам попадание # на сервер. iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS: " iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN: " iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST: " iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags SYN,RST SYN,RST -j DROP # Вводим правила, ограничивающие число RST/ACK-пакетов и # делающие запись в лог-файле, чтобы через пингование хостов # были трудности с определением ОС, установленной на этих # хостах. #Drop RST/ACKs to limit OS detection through pinging iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST: " iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags RST RST,ACK -j DROP iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST: " iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags RST RST,ACK -j DROP # Защита от Syn-flood, (принцип работы подробнее # см. выше в HOWTO) iptables -A FORWARD -p tcp -d $OUR_NET --syn -m limit --limit 1/s -j ACCEPT iptables -A INPUT -p tcp -d $SERVER_IP --syn -m limit --limit 1/s -j ACCEPT # Защита от скрытого сканирования портов # (Furtive port scanner) iptables -A FORWARD -p tcp -d $OUR_NET --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT iptables -A INPUT -p tcp -d $SERVER_IP --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Ping of Death iptables -A FORWARD -p icmp -d $OUR_NET --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A INPUT -p icmp -d $SERVER_IP --icmp-type echo-request -m limit --limit 1/s -j ACCEPT # Разрешаем прохождение пакетов от и к нашему http (https) # серверу. Обращение к веб-серверу из внутренней сети # считать будем отдельно iptables -A INPUT -p tcp -i bridge0 -s $OUR_NET --sport $UNPRIVPORTS -d $SERVER_IP --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp -o bridge0 -d $OUR_NET --dport $UNPRIVPORTS -s $SERVER_IP --sport 80 -j ACCEPT # остальные обращения iptables -A INPUT -p tcp -i bridge0 --sport $UNPRIVPORTS -d $SERVER_IP --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp -o bridge0 --dport $UNPRIVPORTS -s $SERVER_IP --sport 80 -j ACCEPT iptables -A INPUT -p tcp -i bridge0 --sport $UNPRIVPORTS -d $SERVER_IP --dport 443 -j ACCEPT iptables -A OUTPUT -p tcp -o bridge0 --dport $UNPRIVPORTS -s $SERVER_IP --sport 443 -j ACCEPT # Задаём адреса, с которых можно администрировать наш сервер # через ssh, пусть это будут COMPUTER1 и COMPUTER2 iptables -A INPUT -p tcp -i bridge0 -s $COMPUTER1_IP --sport $UNPRIVPORTS -d $SERVER_IP --dport 22 -m mac --mac-source $COMPUTER1_MAC -j ACCEPT iptables -A OUTPUT -p tcp -o bridge0 -s $SERVER_IP --sport 22 -d $COMPUTER1_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A INPUT -p tcp -i bridge0 -s $COMPUTER2_IP --sport $UNPRIVPORTS -d $SERVER_IP --dport 22 -m mac --mac-source $COMPUTER2_MAC -j ACCEPT iptables -A OUTPUT -p tcp -o bridge0 -s $SERVER_IP --sport 22 -d $COMPUTER2_IP --dport $UNPRIVPORTS -j ACCEPT # Выбрасываем все нелегитимные пакеты (RFC 1918). При правиль- # ной настройке их не должно быть в сети с реальными адресами. iptables -A FORWARD -s $CLASS_A -j DROP iptables -A FORWARD -s $CLASS_B -j DROP iptables -A FORWARD -s $CLASS_C -j DROP # Блокируем пакеты, которые мы считаем ненужными. Допишите # правила сами. Ниже блокируется «сетевое окружение # (smb-протокол)» и иже с ним. Чтобы из внешней сети # никто не нашёл забытые share-ресурсы в локальной сети, # если кто-то что-то забыл закрыть. # А из сети в Интернет вряд ли кто-то полезет. iptables -A FORWARD -s ! $OUR_NET -d $OUR_NET -p tcp --dport 137:139 -j DROP iptables -A FORWARD -s ! $OUR_NET -d $OUR_NET -p udp --dport 137:139 -j DROP iptables -A FORWARD -s $OUR_NET -d ! $OUR_NET -p tcp --dport 137:139 -j DROP iptables -A FORWARD -s $OUR_NET -d ! $OUR_NET -p udp --dport 137:139 -j DROP # У меня возникло желание прикрыть часто приходящие про- # верки на наличие proxy и mssql в процессе работы моста. iptables -A FORWARD -d $OUR_NET -p tcp --dport 1433 -j DROP iptables -A FORWARD -d $OUR_NET -p tcp --dport 3128 -j DROP # Разрешим серверу общаться с DNS-серверами, если есть # опасения о безопасности, то правила можно переписать # для конкретных проверенных DNS-cерверов. iptables -A OUTPUT -p tcp -s $SERVER_IP --sport $UNPRIVPORTS --dport 53 -j ACCEPT iptables -A INPUT -p tcp --syn -d $SERVER_IP --dport $UNPRIVPORTS --sport 53 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport $UNPRIVPORTS --dport 53 -j ACCEPT iptables -A INPUT -p udp -d $SERVER_IP --dport $UNPRIVPORTS --sport 53 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport 53 --dport 53 -j ACCEPT iptables -A INPUT -p udp -d $SERVER_IP --dport 53 --sport 53 -j ACCEPT # Разрешаем whois (у меня этих правил нет за ненадобностью) iptables -A OUTPUT -p tcp -s $SERVER_IP --sport $UNPRIVPORTS --dport 43 -j ACCEPT iptables -A INPUT -p tcp ! --syn -d $SERVER_IP --dport $UNPRIVPORTS --sport 43 -j ACCEPT # Если у нас стоит SAMBA, то разрешаем SMB to/from server # внутри локальной сети iptables -A INPUT -p tcp -s $OUR_NET --sport $UNPRIVPORTS -d $SERVER_IP --dport 139 -j ACCEPT iptables -A OUTPUT -p tcp -s $SERVER_IP --sport 139 -d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -p tcp -s $SERVER_IP --sport $UNPRIVPORTS -d $OUR_NET --dport 139 -j ACCEPT iptables -A INPUT -p tcp -s $OUR_NET --sport 139 -d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS -d $SERVER_IP --dport 139 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport 139 -d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport $UNPRIVPORTS -d $OUR_NET --dport 139 -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 139 -d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS -d $SERVER_IP --dport 137 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport 137 -d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport $UNPRIVPORTS -d $OUR_NET --dport 137 -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 137 -d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport $UNPRIVPORTS -d $SERVER_IP --dport 138 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport 138 -d $OUR_NET --dport $UNPRIVPORTS -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport $UNPRIVPORTS -d $OUR_NET --dport 138 -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 138 -d $SERVER_IP --dport $UNPRIVPORTS -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 137 -d $OUR_NET --dport 137 -j ACCEPT iptables -A OUTPUT -p udp -s $OUR_NET --sport 137 -d $OUR_NET --dport 137 -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 138 -d $OUR_NET --dport 138 -j ACCEPT iptables -A OUTPUT -p udp -s $OUR_NET --sport 138 -d $OUR_NET --dport 138 -j ACCEPT iptables -A INPUT -p udp -s $OUR_NET --sport 138 -d $OUR_BROADCAST --dport 138 -j ACCEPT iptables -A OUTPUT -p udp -s $SERVER_IP --sport 138 -d $OUR_BROADCAST --dport 138 -j ACCEPT # Запрещаем Ping of Death и пропускаем обычные ping внутрь iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT # рекомендую исправить и запретить, многие сканеры вначале # пингуют хост, прежде чем его сканировать. # Разрешаем прохождение icmp-пакетов. При требованиях # повышенной безопасности можно пересмотреть (запретить) # эти правила. iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type source-quench -j ACCEPT iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type parameter-problem -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type time-exceeded -j ACCEPT # Разрешаем на сервере делать ping и получать ответы iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # Для работы traceroute на сервере iptables -A OUTPUT -p udp -s $SERVER_IP --sport $TRACEROUTE_SRC_PORTS --dport $TRACEROUTE_DST_PORTS -j ACCEPT # Отбрасываем с уведомлением все пакеты, что сервер пытается # послать наружу. При грамотной настройке пакеты не должны # доходить до этого правила. iptables -A OUTPUT -s $SERVER_IP -j REJECT # Счётчики трафика + разрешение на пропускание трафика через # мост: если можно разрешить, можно и запретить. Исходящий # трафик привязываем к MAC-адресу сетевых карточек iptables -A FORWARD -s $COMPUTER1_IP -m mac --mac-source $COMPUTER1_MAC -j ACCEPT iptables -A FORWARD -d $COMPUTER1_IP -j ACCEPT iptables -A FORWARD -s $COMPUTER2_IP -m mac --mac-source $COMPUTER2_MAC -j ACCEPT iptables -A FORWARD -d $COMPUTER2_IP -j ACCEPT iptables -A FORWARD -s $COMPUTER3_IP -m mac --mac-source $COMPUTER3_MAC -j ACCEPT iptables -A FORWARD -d $COMPUTER3_IP -j ACCEPT .... iptables -A FORWARD -s $COMPUTERn_IP -m mac --mac-source $COMPUTERn_MAC -j ACCEPT iptables -A FORWARD -d $COMPUTERn_IP -j ACCEPT # Правила только для подсчёта следует писать без -j опции # iptables -A FORWARD -s $COMPUTER001_IP -m mac --mac-source $COMPUTER001_MAC # iptables -A FORWARD -d $COMPUTER001_IP # поэкспериментируйте # iptables -L -v -x -n #!/usr/bin/perl $SERVER_IP="x.x.x.2"; $COMPUTER1_IP="x.x.x.3"; $COMPUTER1_MAC="XX:XX:XX:XX:XX:XX"; $COMPUTER2_IP="x.x.x.3"; $COMPUTER2_MAC="XX:XX:XX:XX:XX:XX"; ... # создадим функцию, которая будет ставить точки, удобнее # смотреть на 10.000.000.000 чем на 10000000000 sub DOTS { # расставление точек разрядов $string1 = shift; if(not($string1 =~ /\D/)){ $string1 =~s/(\d{3})$/\.$1/; while ($string1 =~ /^\d{3}/){$string1 =~s/(\d{3}\.\d)/\.$1/;} } $string1 =~s/(^\.)(.*)/$2/; return $string1; } print "Content-type:text/html; charset=koi8-r\n\n"; print "\n"; print "Traffic shower\n\n"; print "\n"; $date = localtime time; $ip=$ENV{"REMOTE_ADDR"}; print $date,"\n
"; # Для работы программы придётся отдельно создать файл-копию # для iptables c установленным флагом SETUID, иначе работать # не будет, файл-копию можно поместить куда угодно, скажем, # в /dir1. C точки зрения безопасности тут возможны слабые # места. system "/dir1/iptables -L -v -x -n >/temp/traffic-dump"; # Вывод сбрасывается в отдельный файл, чтобы можно было этот # файл по нескольку раз просматривать. Если запускать # iptables несколько раз, то при каждом новом запуске # будет новая ситуация (на момент запуска). # открываем файл и "вырезаем" из него нужные нам значения, # помещая их в нужные нам переменные. open(TRAFFIC,"/temp/traffic-dump") or die ("Cannot open file trafic-dump"); for ($index=1; !eof(TRAFFIC); $index++) { $str=; chomp($str); ###### Web server 80 port ######### if ($str=~/tcp -- bridge0 \* 0.0.0.0\/0 $SERVER_IP tcp spts:1024:65535 dpt:80/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$webserver_in=$2;} } if ($str=~/tcp -- \* bridge0 $SERVER_IP 0.0.0.0\/0 tcp spt:80 dpts:1024:65535/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$webserver_out=$2;} } # Во время отладки обратите внимание на число пробелов и # символы, записываемые через "\": при не совпадении строчки # с эталоном будет выведено пустое значение. # Значения для срабатывания регулярных выражений следует # брать из файла /temp/traffic-dump, иначе, если что-то не # так с пробелами и пр, то у вас могут получиться пустые # значения в переменных $webserver_in, $webserver_out # $str=~/\s*(\d+)\s+(\d+)\s(.*)/ должно передавать значение # второго столбца в переменную $2 (подробнее см. книгу # А.Павлова [2] или любой справочник по Perl, раздел # «Регулярные выражения») ###### Computer1 ######### if ($str=~/all -- \* \* $COMPUTER1_IP 0.0.0.0\/0 MAC $COMPUTER1_MAC/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER1_out=$2;} } if ($str=~/all -- \* \* 0.0.0.0\/0 $COMPUTER1_IP/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER1_in=$2;} } ###### Computer2 ######### if ($str=~/all -- \* \* $COMPUTER2_IP 0.0.0.0\/0 MAC $COMPUTER2_MAC/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER2_out=$2;} } if ($str=~/all -- \* \* 0.0.0.0\/0 $COMPUTER2_IP/) { if ($str=~/\s*(\d+)\s+(\d+)\s(.*)/) {$COMPUTER2_in=$2;} } # ... и так далее для других компьютеров... } # for ($index=1; !eof(TRAFFIC); $index++) close(TRAFFIC); # Далее, из полученных значений мы создаём собственно # html-отчёт. Для этого проверяем IP-адрес, с которого за- # прошен скрипт, и выводим значения. Если это IP админист- # ратора ($COMPUTER1_IP), то выводим более сложный отчёт, # со всеми пользователями. Если это другой IP, то выводим # для него свой отчёт – обычно это статистика только на # этот адрес и всё. if ($ip eq $COMPUTER1_IP) { print "\n\n\n"; print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; print ""; print ""; print "\n"; #(и так далее для других компьютеров). $total_out=$webserver_out+$COMPUTER1_out+$COMPUTER2_out; $total_in=$webserver_in+$COMPUTER1_in+$COMPUTER2_in; print ""; print ""; print "\n"; print "
  output input
Computer1 ",DOTS($COMPUTER1_out),"",DOTS($COMPUTER1_in),"
Webserver 80 port ",DOTS($webserver_out),"",DOTS($webserver_in),"
Computer2 ",DOTS($COMPUTER2_out),"",DOTS($COMPUTER2_in),"
Total",DOTS($total_out),"",DOTS($total_in),"
\n\n"; } elsif ($ip eq $COMPUTER2_IP) { print "\n\n\n"; print "\n"; print ""; print ""; print "\n"; print "
  output input
Computer2 ",DOTS($COMPUTER2_out),"",DOTS($COMPUTER2_in),"
\n\n"; } #elsif ($ip eq ...) { # ... #} } else { print "Unknown IP!";} print " "; print ""; # iptables -L -v -x -n -Z 0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log # Multi Router Traffic Grapher -- Example Configuration File # Minimal mrtg.cfg #-------------------- WorkDir: /var/www/html/mrtg Language:ru Target[computer1]:`/sbin/stat/comp1` MaxBytes[computer1]: 125000000000 Title[computer1]: Traffic Analysis for Computer1 PageTop[computer1]:

Stats for Computer1

Directory[computer1]: comp1 XSize[computer1]: 600 YSize[computer1]: 160 Options[computer1]: growright Target[computer2]:`/sbin/stat/comp2` MaxBytes[computer2]: 125000000000 Title[computer2]: Traffic Analysis for Computer2 PageTop[computer2]:

Stats for Computer2

Directory[computer2]: comp2 XSize[computer2]: 600 YSize[computer2]: 160 Options[computer2]: growright Target[web]:`/sbin/stat/web` MaxBytes[web]: 125000000000 Title[web]: Traffic Analysis for Web server 80 PageTop[web]:

Stats for Web server 80

Directory[web]: webdir XSize[web]: 600 YSize[web]: 160 Options[web]: growright #!/bin/bash # web/80 (не забудьте исправить на свой IP) ip=x.x.x.2 # Так как статистика снимается раз в 5 минут, и у нас может # быть много счётчиков, то неразумно запускать каждый раз # iptables. Поэтому мы вывод iptables скидываем в файл и # далее работаем с файлом, читая его сколь угодно раз. # смотрим, когда создан файл: если давно (>5 минут), то # делаем его заново (обратите внимание: ' и ` различны): if [ -f /temp/traffic-dump ] then currenttime=`date +%s` locktime=`date -r /temp/traffic-dump +%s` secondsdiff=`expr $currenttime - $locktime` if [ $secondsdiff -gt 300 ] # если файл устаревший, то есть созданный более 5 минут # назад – генерируем новый: then /sbin/www/iptables -L -v -x -n >/temp/traffic-dump fi else /sbin/www/iptables -L -v -x -n >/temp/traffic-dump fi # для совпадения важно число пробелов out=`cat /temp/traffic-dump |grep "ACCEPT tcp -- \* bridge0 $ip 0.0.0.0/0 tcp spt:80 dpts:1024:65535"` out=`echo $out|cut -d" " -f2` in=`cat /temp/traffic-dump |grep "ACCEPT tcp -- bridge0 \* 0.0.0.0/0 $ip tcp spts:1024:65535 dpt:80"` in=`echo $in|cut -d" " -f2` echo $in echo $out echo 0 echo web # mrtg /etc/mrtg/mrtg.cfg Order deny,allow Deny from all Allow from x.x.x.3 Order deny,allow Deny from all Allow from x.x.x.3 x.x.x.4 Order deny,allow Deny from all Allow from x.x.x.3 # mkdir /usr/lib/apache/passwords # htpasswd -с /usr/lib/apache/passwords/passwords userlogin1 # htpasswd /usr/lib/apache/passwords/passwords userlogin2 AuthType Basic AuthName "yourcompany" AuthUserFile /usr/lib/apache/passwords/passwords Require user userlogin1 AllowOverride None AuthType Basic AuthName "yourcompany" AuthUserFile /usr/lib/apache/passwords/passwords Require user userlogin2 AllowOverride None Order deny,allow Deny from all Allow from x.x.x.3 BugTraq стр. 55 (2 * x) <= (MAXNAME + 1 - 7) + x x <= (MAXNAME + 1 - 7) Program received signal SIGSEGV, Segmentation fault. 0x400ee94a in _IO_vfprintf (s=0xaabbccdd, format=0x809b773 "%s%s", ap=0xbfffd6ac) at vfprintf.c:1024 1024 vfprintf.c: No such file or directory. (gdb) where #0 0x400ee94a in _IO_vfprintf (s=0xaabbccdd, format=0x809b773 "%s%s", ap=0xbfffd6ac) at vfprintf.c:1024 #1 0x400f7047 in fprintf (stream=0xaabbccdd, format=0x809b773 "%s%s")at fprintf.c:32 #2 0x8084ff8 in smtpmessage () #3 0x80847ac in smtpquit () #4 0x8069e89 in mci_uncache () #5 0x8069f14 in mci_flush () #6 0x804e0b9 in finis () #7 0x8073042 in dowork () #8 0x807f9bc in smtp () #9 0x804da8e in main () #10 0x400c19cb in __libc_start_main (main=0x804ac00, argc=3, argv=0xbffffbe4, init=0x804a07c <_init>, fini=0x808918c <_fini>, rtld_fini=0x4000ae60 <_dl_fini>, stack_end=0xbffffbdc) at ../sysdeps/generic/libc-start.c:92 FreeBSD компиляция Александр Прокошев . (точка) – FreeBSD-current. FreeBSD "с переднего края". Не рекомендуется тем, кто только осваивает процесс перекомпиляции. RELENG_5_0 – FreeBSD 5.0 Ветка 5.0-RELEASE, используется для критических багфиксов и патчей системы безопасности. RELENG_4 Ветка FreeBSD-4.x. Сейчас это FreeBSD-STABLE. Основная ветвь развития четвертой версии системы. RELENG_4_7 FreeBSD-4.7-RELEASE, используется для критических багфиксов и патчей системы безопасности. RELENG_4_6 FreeBSD 4.6 и 4.6.2, используется для критических багфиксов и патчей системы безопасности. RELENG_4_5 FreeBSD 4.5, используется для критических багфиксов и патчей системы безопасности. RELENG_4_4 FreeBSD 4.4, используется для критических багфиксов и патчей системы безопасности. RELENG_4_3 FreeBSD 4.3, используется для критических багфиксов и патчей системы безопасности. RELENG_3 Ветка FreeBSD-3.x. Сейчас это 3.x-STABLE. Основная ветвь развития третьей версии системы. RELENG_2_2 Ветка FreeBSD-2.2.x. Устаревшая ветвь. src-all Полное дерево исходников src-base Базовые программы src-bin Программы в /usr/src/bin – то, что после установки находится в /bin src-contrib Contributed software, в том числе awk, gcc, tcpdump и многое другое, без чего не обойтись. src-etc То, что с помощью mergemaster'а устанавливается в /etc src-games Игры. src-gnu GNU software src-include .h-файлы для помещения в /usr/include src-kerberos5 Kerberos 5. src-kerberosIV Kerberos 4. src-lib Исходники системных библиотек. src-libexec Некоторые демоны. Складываются в /usr/libexec src-release Инструменты для построения дистрибутива. src-sbin Будущее содержимое /sbin src-share Будущее содержимое /usr/share src-sys Исходники ядра src-tools Инструменты для тестирования и поддержки системы. Не собираются во время buildworld. src-usrbin Будущее содержимое /usr/bin src-usrsbin Будущее содержимое /usr/sbin src-crypto src-eBones src-secure src-sys-crypto Криптоподсистема. --== cut /etc/cvsupfile.sys ==-- # Файл обновления системы *default host=cvsup5.FreeBSD.org *default base=/usr *default prefix=/usr *default release=cvs *default tag=RELENG_4 *default delete use-rel-suffix compress src-all # src-base # src-bin # src-contrib # src-etc # src-games # src-gnu # src-include # src-kerberos5 # src-kerberosIV # src-lib # src-libexec # src-release # src-sbin # src-share # src-sys # src-tools # src-usrbin # src-usrsbin # src-crypto # src-eBones # src-secure # src-sys-crypto --== end cut ==-- --== cut here ==-- ice.root# cvsup /etc/cvsupfile.sys Connected to cvsup5.FreeBSD.org Updating collection src-all/cvs Edit src/etc/Makefile [выводимые сообщения опущены] Edit src/share/misc/pci_vendors Finished successfully ice.root# --== end cut ==-- MYCONF: cd /usr/src/sys/i386/conf cp GENERIC MYCONF make -j4 buildworld make buildkernel KERNCONF=MYCONF shutdown now make installkernel KERNCONF=MYCONF make installworld fastboot LIDS Сергей Яремчук [sergej@grinder sergej]$ ls -l /etc/passwd /etc/shadow -rw-r--r-- 1 root root 1628 Авг 13 18:31 /etc/passwd -r-------- 1 root root 1081 Авг 13 18:31 /etc/shadow [sergej@grinder sergej]$ ls -l /usr/bin/passwd -r-s--x--x 1 root root 15104 Мар 14 03:44 /usr/bin/passwd # bzip2 -cd linux-2.4.19.tar.bz2 | tar -xvf - # tar -zxvf lids-1.1.2rc4-2.4.19.tar.gz # cd linux_install_path/linux # patch -p1 < /lids_install_path/lids-1.1.2rc4-2.4.19.patch # rm -rf /usr/src/linux # ln -s linux_install_patch/linux /usr/src/linux # cd /usr/src/linux # make xconfig (или make menuconfig) # make dep # make clean # make bzImage # make modules # make modules_install # cp arch/i386/boot/bzImage /boot/lids-kernel # ./configure && make && make install # lidsadm -P # lidsadm -h. lidsadm -A [-s subject] -o object [-d] -j # /sbin/lidsadm -A -o /etc/shadow -j DENY # ls /etc/shadow # /sbin/lidsadm -A -s /bin/login -o /etc/shadow -j READ # /sbin/lidsadm -A -o /sbin/ -j READ # /sbin/lidsadm -A -o /var/log/samba/ -j APPEND # /sbin/lidsadm -A -o /var/log/secure -j APPEND # lidsadm -L # /sbin/lidsadm -V # /sbin/lidsadm -U # /sbin/lidsadm -D /etc/httpd/ /sbin/lidsadm -I # /sbin/lidsadm -S -- -LIDS # /sbin/lidsadm -S -- +LIDS # /sbin/lidsadm -S -- +RELOAD_CONF # /sbin/lidsadm -S -- -LIDS_GLOBAL # /sbin/lidsadm -A -s /usr/sbin/httpd -t -o CAP_HIDDEN -j INHERIT security=0: grub>lids-kernel security=0 Система криптографической защиты информации Владимир Мешков ENTRY(sys_call_table) . . . .long SYMBOL_NAME(sys_gost) /* 226. Новый системный вызов! */ #define __NR_gost 226 /* Новый системный вызов! */ #define SYS_gost __NR_gost asmlinkage int sys_gost(char * block, size_t count, int flag) { return 0; } #include #include #define E_START 1 #define E_STOP 0 static inline _syscall3(int,gost,char *,buf,off_t,count,int,flag) #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ type name(type1 arg1,type2 arg2,type3 arg3) \ { \ long __res; \ __asm__ volatile ("int $0x80" \ : "=a" (__res) \ : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \ "d" ((long)(arg3))); \ __syscall_return(type,__res); \ } mknod /dev/gost c 69 0 #include #include #include #include #include #include #include #include "gost_var.h" #define GOST_MAJOR 69 – старший номер устройства int key_enable = 0; – флаг наличия ключевой информации в БКИ int key_init = 0; – флаг инициализации ключевой информации struct key_info { char key_d[64]; __u32 X[8]; char sp[8]; } keys; #include const __u32 C1=0x01010104; const __u32 C2=0x01010101; __u32 SM1, SM2, N3, N4; union { struct { __u32 N1; __u32 N2; } lg; char N[8]; } nac; extern void *sys_call_table[]; int (*orig_gost)(char *block, size_t count, int flag); int init_module(void) { if (register_chrdev(GOST_MAJOR,"gost",&gost_fops)) return -EIO; orig_gost = sys_call_table[SYS_gost]; sys_call_table[SYS_gost] = own_gost; return 0; } struct file_operations gost_fops = { write: write_gost, open: open_gost, release: close_gost, }; static int open_gost(struct inode *inode, struct file *file) { if (MOD_IN_USE) return -EBUSY; if (MINOR(inode->i_rdev) != 0) return -ENODEV; if ((file->f_mode & 1) != 1) return -EBUSY; memset(&keys,0,sizeof(struct key_info)); key_enable = 0; MOD_INC_USE_COUNT; return 0; } static ssize_t write_gost(struct file *file, const char *buf, size_t count, loff_t *ppos) { if (count!=sizeof(struct key_info)) return -EINVAL; copy_from_user((char *)&keys,buf,count); key_enable = 1; return count; } static int close_gost(struct inode *inode, struct file *file) { MOD_DEC_USE_COUNT; return 0; } void cleanup_module() { sys_call_table[SYS_gost]=orig_gost; memset(&keys,0,sizeof(struct key_info)); unregister_chrdev(GOST_MAJOR,"gost"); return; } int own_gost(char *block, size_t count, int flag) { int i; if ((flag && key_enable)) { if (key_init == 0) init_key(); __asm__ __volatile__( " addl %3,%%eax \n\t" " jnc 1f \n\t" " incl %%eax \n\t" "1: cmpl %2,%%eax\n\t" " jnz 2f \n\t" " xorl %%eax,%%eax \n\t" "2:" :"=a"(N4) :"0"(N4),"b"(ULONG_MAX),"d"(C1)); N3 += C2; nac.lg.N1 = N3; nac.lg.N2 = N4; symple_replace_crypt(); for(i=0;i<=7;i++) block[i]^=nac.N[i]; return count; } key_init = 0; return (0); } void init_key() { memset(&nac,0,sizeof(nac)); memcpy(nac.N,keys.sp,8); symple_replace_crypt(); N3=nac.lg.N1; N4=nac.lg.N2; key_init = 1; return; } void symple_replace_crypt() { int i,n; for(n=1;n<=3;n++) { for(i=0;i<=7;i++) op(i); } for(i=7;i>=1;i--) op(i); SM1=nac.lg.N1+X[0]; SM2=block(SM1,keys.key_d,nac.lg.N2); nac.lg.N2=SM2; return; } void op(int i) { SM1 = nac.lg.N1+X[i]; SM2 = block(SM1,keys.key_d,nac.lg.N2); nac.lg.N2 = nac.lg.N1; nac.lg.N1 = SM2; return; } __u32 block(__u32 SM1, char *k, __u32 N2) { __u32 SM2; __asm__ __volatile__ ( " cld \n\t" " pushl %%edx \n\t" " xorl %%ecx,%%ecx \n\t" " xorl %%edx,%%edx \n\t" " movw $4,%%cx \n\t" "1: pushl %%esi \n\t" " pushw %%cx \n\t" " pushl %%eax \n\t" " pushl %%edx \n\t" " xorl %%edi,%%edi \n\t" " xorw %%cx,%%cx \n\t" " movl %%esi,%%edi \n\t" " addl $8,%%edi \n\t" " xorl %%ebx,%%ebx \n\t" " xorw %%dx,%%dx \n\t" " pushw %%ax \n\t" " shlb $4,%%al \n\t" " shrb $4,%%al \n\t" " movb %%al,%%dl \n\t" " popw %%ax \n\t" " shrb $4,%%al \n\t" " movb %%al,%%dh \n\t" " xorl %%eax,%%eax \n\t" " movb %%dl,%%bl \n\t" " btw $0,%%bx \n\t" " jnc 2f \n\t" " decb %%bl \n\t" " shrb $1,%%bl \n\t" " movw (%%esi,%%ebx),%%ax \n\t" " shrb $4,%%al \n\t" " jmp 3f \n\t" "2: shrb $1,%%bl \n\t" " movw (%%esi,%%ebx),%%ax \n\t" " shlb $4,%%al \n\t" " shrb $4,%%al \n\t" "3: movb %%al,%%cl \n\t" " xorl %%ebx,%%ebx \n\t" " movb %%dh,%%bl \n\t" " btw $0,%%bx \n\t" " jnc 4f \n\t" " decb %%bl \n\t" " shrb $1,%%bl \n\t" " movw (%%edi,%%ebx),%%ax \n\t" " shrb $4,%%al \n\t" " shlb $4,%%al \n\t" " jmp 5f \n\t" "4: shrb $1,%%bl \n\t" " movw (%%edi,%%ebx),%%ax \n\t" " shlb $4,%%al \n\t" "5: orb %%cl,%%al \n\t" " popl %%edx \n\t" " movb %%al,%%dl \n\t" " popl %%eax \n\t" " popw %%cx \n\t" " rorl $8,%%edx \n\t" " shrl $8,%%eax \n\t" " xorl %%esi,%%esi \n\t" " popl %%esi \n\t" " addl $16,%%esi \n\t" " decw %%cx \n\t" " jz 6f \n\t" " jmp 1b \n\t" "6: movl %%edx,%%eax \n\t" " roll $11,%%eax \n\t" " popl %%edx \n\t" " xorl %%edx,%%eax \n\t" :"=a" (SM2) :"0"(SM1),"S"(k),"d"(N2) :"ebx","ecx","edi"); return SM2; } block; op; symple_replace_crypt; init_key; own_gost; write_gost; open_gost; close_gost; init_module; cleanup_module. CC = gcc module = sys_call_gost.o CFLAGS = -O2 -Wall LINUX = /usr/src/linux MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include sys_call_gost.o: sys_call_gost.c $(CC) $(CFLAGS) $(MODFLAGS) -c sys_call_gost.c fdformat /dev/fd0u1440 mkfs -V -t ext2 /dev/fd0 mkdir /floppy mount -t ext2 /dev/fd0 /floppy #include #include #define MOUNT_DIR "/floppy" int main() { int s,d,sp,rnd; char buf[64]; rnd=open("/dev/urandom",O_RDONLY); d=open(MOUNT_DIR"/key_d",O_CREAT|O_WRONLY,0600); s=open(MOUNT_DIR"/key_s",O_CREAT|O_WRONLY,0600); sp=open(MOUNT_DIR"/sp",O_CREAT|O_WRONLY,0600); bzero(buf,64); read(rnd,buf,64); if(write(d,buf,64)!=64) { perror("key_d"); exit(-1); } close(d); bzero(buf,64); read(rnd,buf,32); if(write(s,buf,32)!=32) { perror("key_s"); exit(-1); } close(s); bzero(buf,64); read(rnd,buf,8); if(write(sp,buf,8)!=8) { perror("sp"); exit(-1); } close(sp); close(rnd); return (0); } umount /dev/fd0 #include #include #include #include #include #define MOUNT_DIR "/floppy" int main() { int s,d,sp,gost; struct key_info { char key_d[64]; u_long X[8]; char sp[8]; } keys; memset(&keys,0,sizeof(struct key_info)); gost=open("/dev/gost",O_RDWR); if(gost < 0) { perror("gost"); exit(-1); } sp=open(MOUNT_DIR"/sp",O_RDONLY); if(sp < 0) { perror("sp"); exit(-1); } d=open(MOUNT_DIR"/key_d",O_RDONLY); if(d < 0) { perror("key_d"); exit(-1); } s=open(MOUNT_DIR"/key_s",O_RDONLY); if(s < 0) { perror("key_s"); exit(-1); } if(read(d,keys.key_d,64)!=64){ perror("key_d"); exit(-1); } if(read(s,(char *)&keys.X,32)!=32){ perror("key_s"); exit(-1); } if(read(sp,keys.sp,8)!=8){ perror("sp"); exit(-1); } write(gost,(char *)&keys,sizeof(struct key_info)); printf("\nKeys loaded\n\n"); close(gost); close(d); close(s); close(sp); return (1); } gcc -o write_key write_key.c #include #include #include int main (int argc, char **argv) { int in,n; char buff[8]; if(argc!=2) { printf("\n\tUsage: gost [input file]\n\n"); exit(0); } in=open(argv[1],O_RDWR); if(in < 0) { perror("input"); exit(-1); } memset(buff,0,8); while((n=read(in,buff,8)) > 0) { gost(buff,n,E_START); lseek(in,-n,SEEK_CUR); write(in,buff,n); } gost(0,0,E_STOP); close(in); return 0; } gcc -o gost gost.c insmod sys_call_gost.o