Помощь - Поиск - Пользователи - Календарь
Полная версия: FreeBSD
Богданович.ru :: Форум > Программы :: Software > *NIX системы
mrak
Некоторые полезные sysctl переменные для FreeBSD

security.bsd.* - управление моделью безопасности
security.bsd.see_other_uids, security.bsd.see_other_gids - если 1, то пользователи (группы) могут видеть чужие процессы, сокеты и т.д. через ps, netstat, procfs;
security.bsd.conservative_signals - если 1, то некоторые сигналы запрещается посылать setuid/setgid процессам;
security.bsd.unprivileged_proc_debug - если 1, то пользовательский процесс можно отлаживать через ptrace, procfs, ktrace и т.д..
security.bsd.unprivileged_read_msgbuf - если 1, то пользовательский процесс может читать из системного консольного буфера сообщений;
security.bsd.hardlink_check_uid, security.bsd.hardlink_check_gid - если 1, то пользователи могут делать hardlink только на собственные файлы;
security.bsd.unprivileged_get_quota - если 1, пользователи могут просматривать информацию по установленным для них квотам.
security.bsd.see_other_uids - если 0, пользователь может видеть только свои процессы;
vfs.usermount - если 1, то непривилегированный пользователь может монтировать и размонтировать FS, если для устройства выставлены "rw" права и пользователь является владельцем точки монтирования;
security.jail.* - ограничения для jail
security.jail.set_hostname_allowed - если 1, то внутри jail можно поменять имя хоста;
security.jail.socket_unixiproute_only - если 1 , то сокет в jail можно создать только для доменов PF_LOCAL, PF_INET или PF_ROUTE, иначе, возвращается ошибка;
security.jail.sysvipc_allowed - если 1, то то в jail можно получить доступ к глобальному System V IPC;
security.jail.getfsstatroot_only - если 1, то в jail можно получить информацию (df)только о той файловой системе на которой создан jail;
security.jail.allow_raw_sockets - если 1, то в jail можно создавать raw sockets;
security.jail.chflags_allow - если 1, то процессы в jail могут модифицировать флаги ФС.
IPFW
net.link.ether.bridge_ipfw - если 1 и ядро собрано с опциями IPFIREWALL и BRIDGE, то позволяет использовать ipfw для трафика внутри бриджа;
net.link.ether.ipfw - если 1, то ipfw2 позволяет фильтровать по MAC адресам;
net.inet.ip.fw.autoinc_step - задается число на которое увеличивается счетчик при добавления нового ipfw правила, когда явно не указан его номер;
net.inet.ip.fw.debug - если 1, то в логи помещается дополнительная отладочная информация по работе ipfw;
net.inet.ip.fw.verbose - если 0, то не отображать работу "log" правил в syslog;
net.inet.ip.fw.one_pass - если 1, то просмотр правил ipfw прекращается сразу после подпадание под queue или pipe правило. Если 0, то продолжается обработка далее идущих правил;
ICMP, соединение.
net.inet.icmp.icmplim - задается максимальное число ICMP "Unreachable" и TCP RST пакетов, которое может быть отправлено в секунду, net.inet.icmp.icmplim_output=0 позволяет не отражать в логах факты превишения лимита;
net.inet.tcp.icmp_may_rst, если 1, то TCP соединения со статусом SYN_SENT, могут быть оборваны посредством сообщения "ICMP unreachable";
net.inet.ip.redirect - если 0, то нет реакции на ICMP REDIRECT пакеты;
net.inet.icmp.log_redirect - если 1, то все ICMP REDIRECT пакеты отражаются в логе;
net.inet.icmp.drop_redirect - если 1, то ICMP REDIRECT пакеты игнорируются;
net.inet.tcp.icmp_may_rst - если 1, то игнорируются ICMP сообщения от блокировки пакета по пути;
net.inet.icmp.bmcastecho - для защиты от SMURF атак (ICMP echo request на broadcast адрес) нудно поставить 0;
Тюнинг сетевой подсистемы, борьба с DoS атаками
net.inet.tcp.log_in_vain, net.inet.udp.log_in_vain - если 1, отражаем в логе попытки соединения к портам, для которых нет активных сервисов;
net.inet.tcp.blackhole - если 1, то SYN пакеты пришедшие на порты для которых нет активных сервисов, остаются без RST ответа, если 2, то на любые пакеты нет ответа (затрудняет сканирования портов);
kern.ipc.nmbclusters - если по "netstat -m" mbufs в "peak" приближается к "max", то число сетевых буферов нужно увеличить (kern.ipc.nmbclusters=N в /boot/locader.conf);
net.inet.ip.forwarding - если 1, то машина может форвадить пакеты между интерфейсами;
net.inet.tcp.sack.enable - если 1, то включен TCP Selective Acknowledgements (SACK, RFC 2018) позволяющий увеличить производительность системы в ситуации большой потери пакетов;
net.link.ether.inet.max_age - время жизни записи в IP route кэше, рекомендуется уменьшить для ослабления эффекта от DoS атак через ARP флуд;
Оборудование и системная информация
dev.cpu.0.freq_levels - выдает список поддерживаемых частот, на которые можно переключить CPU, путем указание нужной частоты через dev.cpu.0.freq;
hw.snd.maxautovchans, hw.snd.pcm0.vchans - задается число виртуальных звуковых каналов, для каждого из которых может быть отдельный источник звука (на выходе они будут смикшированы);
kern.boottime - время последней загрузки системы;
kern.disks - список дисков в системе;
kern.geom.debugflags, для работы boot0cfg и подобных утилит нужно установить в 16;
Изменение и тюнинг системных ограничений
kern.coredump - если 0, то при крахе приложения не будут создаваться core файлы, формат имени и путь для которых задается через kern.corefile (например: /tmp/%U.%N.core). kern.sugid_coredump=0 позволяет запретить генерацию core suid/sgid процессами;
kern.maxfiles - максимально допустимое число открытых файлов (файловых дескрипторов), текущее число открытых файлов можно посмотреть через kern.openfiles;
kern.maxprocperuid - максимально допустимое число процессов, которое может быть запущено из-под одного пользователя;
kern.maxvnodes - максимальное число vnode для кеширования дисковых операций, текущее значение можно посмотреть через vfs.numvnodes или debug.numvnodes/debug.freevnodes;
SMP (FreeBSD 5)
kern.smp.maxcpus (machdep.smp_cpus) - максимальное число процессоров, поддерживаемое текущей сборкой ядра;
kern.smp.active, kern.smp.disabled - число активных и выключенных CPU;
kern.smp.cpus (machdep.smp_active) - сколько CPU в online;
kern.smp.forward_signal_enabled - включить возможность мгновенной пересылки сигнала для процессов выполняемых в данный момент времени на разных CPU;
kern.smp.forward_roundrobin_enabled;
ARP
net.link.ether.inet.log_arp_movements - отражать в логе все широковещательные ARP пакеты с хостов MAC адрес которых отсутствует в локальном ARP кэше;
net.link.ether.inet.log_arp_wrong_iface - отражать в логе все ARP пакеты пришедшие с неправильного интерфейса;
Lelik
Балансировка двух каналов средствами ipfw под FreeBSD

natd -p 8668 -a ip1
natd -p 8669 -a ip2

ipfw add divert 8668 ip from any to ip1 recv if1
ipfw add divert 8669 ip from any to ip2 recv if2
ipfw add check-state
ipfw add prob 0.5 divert 8668 ip from 192.168.0.0/16 to any xmit if1 keep-state
ipfw add divert 8669 ip from 192.168.0.0/16 to any xmit if1 keep-state
ipfw add fwd gw1 ip from ip1 to any out xmit if1 (если default на if1)
ipfw add fwd gw2 ip from ip2 to any out xmit if1

Lelik
Безопасное редактирование правил ipfw FreeBSD

Для безопасного редактирование правил ipfw рекомендую обратить внимание на скрипт change_rules.sh,
находящийся в /usr/share/examples/ipfw. В случае неправильных действий он вернёт старый набор правил,
а также сообщит администратору об изменениях в файрволе по почте.

Как разделить канал между пользователями используя ipfw.

/sbin/ipfw pipe 1 config bw 7000Kbit/s
/sbin/ipfw queue 1 config pipe 1 weight 75 mask dst-ip 0x00000000
/sbin/ipfw queue 2 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw queue 3 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw queue 4 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw add queue 1 ip from any to 192.168.0.0/24
/sbin/ipfw add queue 2 ip from any to 192.168.1.0/24
/sbin/ipfw add queue 3 ip from any to 192.168.2.0/24
/sbin/ipfw add queue 4 ip from any to 192.168.3.0/24

Итого имеем: одну толстую трубу на 7К и 4 очереди в нее.
У первой приоритет 75% канала. У остальных - по 50%

Пример ограничения полосы пропускания трафика в FreeBSD

Собираем ядро с опциями:
options DUMMYNET
options IPFIREWALL
Ограничиваем трафик для сеток 1.1.1.0/24 и 3.3.3.0/24 на 14000 кбит/с:
ipfw add pipe 50 tcp from any to 1.1.1.0/24 via fxp0
ipfw add pipe 50 tcp from any to 3.3.3.0/24 via fxp0
ipfw pipe 50 config bw 14Kbit/s
Для внесения задержки на N ms, используйте delay N после config.
Для установки веса данного пайпа по отношению к другим пайпам используйте weight вес.
Для WF2Q ограничения трафика используйте ipfw queue
(queue N config [pipe pipe_nr] [weight weight] [queue {slots | size})
PS (комментарий от gara@mail.ru):
Если возникает необходимость организовать "канал" для каждого пользователя из данной сети то пишем:
ipfw pipe 10 config mask dst-ip 0x000000ff bw 1024bit/s queue
ipfw add pipe 10 tcp from any to 1.1.1.0/24 via fxp0
Теперь каждый хост из сети 1.1.1.0/24 имеет свой канал 1024bit/s
mrak
Как запретить открывать более 30 соединений с одного IP

Запретим более 30 коннектов для 80 порта сервера 1.2.3.4.
ipfw add allow tcp from any to 1.2.3.4 80 limit src-addr 30
ipfw add allow tcp from any to 1.2.3.4 80 via fxp0 setup limit src-addr 10
Вместо src-addr можно использовать src-port, dst-addr, dst-port
Lelik
Как в FreeBSD добавить/убрать алиас для сетевого интерфейса

Добавить: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 alias
Убрать: ifconfig fxp0 inet 192.168.1.1 netmask 255.255.255.255 -alias
mrak
Перенос системы FreeBSD на новый жёсткий диск. [редактировать]
По ссылке приведён удачный метод переноса FreeBSD на новый жёсткий диск произвольного размера.

Вкратце это делается так:

1. Подключаем новый жёсткий диск в систему с FreeBSD (/dev/ad1s1)

2. С помощью /stand/sysinstall разбиваем новый диск на разделы так же как это сделано на старом.
То есть чтобы /dev/ad0s1a соответствовал /dev/ad1s1a - размер /dev/ad1s1a может быть большем чем на /dev/ad0s1a.

3. Создаём временные папку и подпапки:
mkdir /backup
mkdir /backup/root
mkdir /backup/usr
mkdir /backup/var
mkdir /backup/tmp

4. Загружаемся в single user

5. Монтируем разделы:
mount /dev/ad1s1a /backup/root
mount /dev/ad1s1e /backup/var
mount /dev/ad1s1f /backup/usr
(тут указываем свои)

6. Переносим систему:

( dump -0f - / ) | ( cd /backup/root ; restore -rf - )
( dump -0f - /var ) | ( cd /backup/var ; restore -rf - )
( dump -0f - /usr ) | ( cd /backup/usr ; restore -rf - )

7. Размонтируем
umount /backup/root
umount /backup/var
umount /backup/usr

8. Включаем Soft Updates
tunefs -n enable /dev/ad1s1a
tunefs -n enable /dev/ad1s1e
tunefs -n enable /dev/ad1s1f

Всё теперь можно с чистой совестью убрать из системы старый жёсткий диск, а на его место поставить новый.
mrak
Принудительное проксирование в FreeBSD

Для принудительного проксирования, на прокси-сервере следует ввести
правила Firewall:
01000 fwd 127.0.0.1,3128 tcp from 10.128.0.0/16 to any 80,8080,8101
В squid.conf нужно добавить:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
На маршрутизаторе "развернуть" Веб-трафик на ПРОКСИ-сервер:
ipfw add 10 fwd ip_прокси tcp from 10.128.0.0/16 to any 80,8080 out
xmit lnc1
mrak
Как переключить сетевую карту в FreeBSD из full-duplex в half-duplex

Текущий режим работы сетевой карты можно посмотреть выполнив:
# ifconfig fxp0
Перевести сетевую карту в режим работы 10baseT/UTP half-duplex:
# ifconfig fxp0 media 10baseT/UTP mediaopt half-duplex
Автоматически выбрать режим:
# ifconfig fxp0 media autoselect
Подробнее: man 4 ed, man 4 rl, man 4 fxp
mrak
Быстрая настройка удаленной консоли SSH и SFTP из Windows на FreeBSD

Задача - коннектится к серверу FreeBSD по протоколу SSH с Windows машины.

Внимание!!! Описываемый метод позволяет получать доступ к серверу без использования ключей аутентификации. Поэтому полная защищенность НЕ ГАРАНТИРОВАНА!!! Рекомендуется использовать данный метод для доступа к серверу из локальной сети. Для более подробного ознакомления с SSH рекомендую обратится к трудамАндрея Лаврентьева .

Забираем клиента Windows Отсюда забираем последнюю версию putty.exe (_http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)

Меняем на сервере FreeBSD файлы
/etc/rc.conf
Добавляем строчку:
sshd_enable="YES"
/etc/ssh/sshd_config
Оставляем
LoginGraceTime 600
PermitRootLogin yes
UseLogin yes
Остальное заремить

Файрвол должен пропускать соединения с 22 портом

Перегружаем сервер (можно ps aux|grep sshd и kill <номер процесса>)

Запускаем на локальной машине с Windows Putty прописываем IP сервера и указываем соединение SSH

Не забываем, что в /etc/inetd.conf надо закоментировать строчку #telnet stream tcp nowait root /usr/libexec/telnetd telnetd
и прочие удаленные консоли.

Теперь обезопасим (с теми же оговорками что и раньше) подключение к серверу по ftp.

Забираем клиента Windows для sftp Отсюда забираем последнюю версию psftp.exe и plink.exe (_http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)

Меняем на сервере FreeBSD файлы
/etc/ssh/sshd_config
Добавляем в конец строчку
Subsystem sftp /usr/local/libexec/sftp-server (если такой программы на вашем сервере не оказалось - считайте что вы попали на установку OpenSSH :D)

К хорошему привыкаешь быстро и отказатся от FAR менеджера просто невозможно, по этому качаем плагин для работы с сервером через FAR тут _http://www.geocities.com/farscp/ страничка плагина

Теперь остается скопировать файлы плагина в папку FAR\Plugin\SCP и использовать пункт scp в меню появляющемся при нажатии Alt+F1 (F2).

Не забываем, что в /etc/inetd.conf надо закоментировать строчку
#ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
mrak
Настройка newsyslog.conf

Ротация журналов

Автор: Станислав Лапшанский, slapsh@kos-obl.kmtn.ru

Статья является переводом текста Майкла Лукаса (Michael Lucas).

Файлы журналов растут. Собственно говоря для этого они и предназначены. Как системный администратор, вы должны иметь способ контролировать их рост. Для этого FreeBSD имеет стандартное средство - newsyslog.

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

По умолчанию система настроена на запуск newsyslog один раз в час, это делается при помощи демона cron. Newsyslog читает конфигурационный файл /etc/newsyslog.conf и проверяет каждый указанный там файл журнала. При совпадении указанного условия производится ротация соответствующего журнала.

В файле /etc/newsyslog.conf каждая строка содержит конфигурацию ротации для одного файла журнала. В начале каждой строки указывается полное имя файла журнала, например /var/log/httpd-error.log.

Далее идет необязательное поле, которое, кстати не используется в поставляемом вместе с системой newsyslog.conf, это список из владельца и группы файла, разделенных двоеточием. Вот так: "root:wheel". Newsyslog может изменять владельца и группу и старых файлов журналов. По умолчанию владельцем устаревших журналов является пользователь root, группы wheel. Эту возможность вы можете с успехом применять на многопользовательских машинах.

Вы можете указать изменение только владельца, или только группы. В этом случае вы должны будете использовать двоеточие с пустым местом там, где должен находиться неизменяемый параметр. Например ":www" сменит группу на "www", а "user827:" заменит владельца на "user827".

Третье поле содержит режим доступа к устаревшим файлам журналов в стандартном трехциферном Unix-формате.

Далее идет счетчик, указывающий newsyslog на количество хранимых устаревших журналов. Newsyslog начинает отсчет файлов с нуля. В то время как большинство программ начинают считать с нуля, newsyslog включает 0 <по умолчанию> и считает файлы не учитывая нулевой. По умолчанию для журнала /var/log/massages счетчик равен пяти, при этом /var/log содержит следующие файлы:

messages
messages.0.gz
messages.1.gz
messages.2.gz
messages.3.gz
messages.4.gz
messages.5.gz

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

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

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

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

Пока все просто, правда?

Шестое поле, указывающее время, заставляет плакать новичков в системном администрировании. Поле времени может содержать данные четырех типов: <звездочку>, число или два различных формата даты.

Если вы не хотите производить ротацию журналов в определенное время, просто поставьте в это поле <звездочку>.

Если в поле будет число, то newsyslog будет проводить ротацию по прошествии указанного количества часов. Например, если вы хотите, что бы ротация проводилась каждые 24 часа, и вам не важно в какое именно время, то просто поставьте в это поле число <24>.

Если поле начинается символом <@>, то считается что время представлено в формате ISO-8601, этот стандарт используется newsyslog в большинстве Unix-подобных операционных систем. Этот формат использовался первой версией newsyslog разработанной в MIT (Массачусетский Технологический Институт - прим. переводчика). На первый взгляд этот формат не совсем понятен. Но, поскольку это стандарт, FreeBSD его поддерживает.

Полная запись даты в формате ISO-8601 состоит из 16 цифр с буквой <T> в середине. Первые четыре цифры означают год, следующие две - месяц, и еще две - день месяца. Буква <T> идет после даты, отделяя ее от времени, как десятичная точка в вещественных числах отделяет дробную часть от целой. После буквы <T> идут две цифры часа, затем две цифры минут и наконец две цифры секунд. Например дата 2 февраля 2002 года, 21:15:08, в формате ISO-8601будет выглядеть следующим образом:

20020202T211508

Вы обязательно должны ставить букву <T> в ISO-8601-дате.

Указание полных дат в формате ISO-8601 просто и очевидно. Путаница начинается, когда вы не пишете полную дату. Вы можете указать поля даты только рядом с буквой <T>, оставив остальное место незаполненным. Все неуказанные поля не будут учитываться при сравнении.

Например T23 значит - любой день в году, 23:00. Если вы напишете в newsyslog.conf @T23, то ротация этого журнала будет проводиться каждый день, ровно в 23:00. Запись 4T00 значит полночь 4 числа каждого месяца, таким образом @4T00 будет запускать ротацию в это время.

Так же как при работе с crontab вам следует уточнить часы ротации. Указание даты типа @7T будет запускать ротацию один раз в час, каждый час седьмого числа каждого месяца. Таким образом такая дата будет запускать ротацию раз в час на протяжении целого дня. Это может быть полезно для отладки, но вряд ли пригодится в реальной жизни.

Эта система имеет одну серьезную проблему - она не дает простого способа задавать ежедневно выполняемые задачи. Желание запустить ротацию журнала по понедельникам, не является чем-то необычным. Запустить ротацию журнала в последний день месяца таким образом вообще не удастся. Тут на помощь приходит второй формат времени.

Если запись времени начинается со знака доллара "$", то считается, что время задается в специфическом FreeBSD-формате <месяц-неделя-день>. Это очень похоже на cron и позволяет вам установить конкретные дни недели для выполнения задачи.

Этот формат использует три буквенных идентификатора: M (день месяца), W (день недели), H (час дня). После каждого из них идет число, указывающее точное время запуска. Часы находятся в интервале от 0 до 23, дни недели от 0 (воскресенье), до 6 (суббота). Дни месяца: от 1 и до количества дней в конкретном месяце.

Например для запуска ротации каждое воскресение в 8 утра вам следует задать время как $W0H8. Если вы захотите ротировать журналы в полдень 5 числа каждого месяца, то напишите $M5H12.

Одна интересная функция этой системы позволяет вам автоматически задавать ротацию на последний день месяца используя специальный <день месяца> - <L> (от last - последний. Прим. переводчика). Без этого знака было бы очень трудно задать ротацию журнала в последний день месяца без написания скрипта, который бы вставлял количество дней в конкретном месяце. Если вы хотите запустить ротацию вашего журнала аккаунтов за два часа до начала нового месяца, вы должны использовать запись $MLH22.

После того, как вам удалось точно указать время ротации, перейдем к полю флагов. Это поле необязательно для большинства журналов, однако для некоторых оно жизненно важно. Newsyslog вставляет сообщение <logfile turned over> в каждый вновь созданный файл журнала. Если журнал ведется в двоичном виде (как например /var/log/wtmp), то добавление такого сообщения обязательно его испортит. Флаг <B> запрещает newsyslog'у вставлять это сообщение.

Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг укажет newsyslog, что старые журналы следует сжать gzip'ом.

Одновременно допускается использовать только один из этих флагов.

Следующее поле задает путь к <pid-файлу> процесса пишущего журнал. Использование pid-файлов является простым способом записи поля ID процесса в системе, так что бы другие программы могли его легко прочитать. Большинство программ хранят свои pid-файлы в каталоге /var/run - поглядите них у себя на машине. Если в этом поле вы укажете полный путь к pid-файлу, то newsyslog будет посылать сигнал этому процессу когда будет производиться ротация. Например веб-сервер Apache должен быть оповещен при ротации его журналов. Записав в этом поле полный путь к его pid-файлу вы заставите newsyslog посылать процессу Apache сигнал kill -1, что бы он запустил свою часть обработки ротации журналов.

Большинство программ поддерживают ротацию журналов сигналом kill -1 или SIGHUP. Некоторые программы требуют специального сигнала, когда их файлы ротируют. Если вы используйте программу такого типа, то укажите номер необходимого сигнала в последнем поле.

Давайте соберем все сказанное вместе, в самом худшем случае, в примере, в который трудно поверить. Итак у вас есть журнал базы данных, который вы хотите ротировать в 23 часа в последний день каждого месяца. В документации базы данных сказано, что вы должны послать процессу базы сигнал прерывания (SIGINT или сигнал номер 2) после ротации. Вы хотите, что бы архивные журналы принадлежали пользователю "dbadmin" и читать их мог только он. Более того, журналы - двоичные файлы и должны быть не тронуты newsyslog'ом. Ваш newsyslog.conf должен выглядеть следующим образом:

/var/log/database dbadmin: 600 30 * $MLH23 B /var/run/db.pid 2

Это крайний случай, в большинстве реальных ситуаций вам следует только собрать имя файла и условие ротации. Всего-то.
mrak
Pawel Dawidek опубликовал текущие наработки проекта GJournal для FreeBSD 6.x и 7.x, инструкцию по организации журналирования данных и мета-данных UFS и результаты тестирования производительности системы.

Ниже небольшая инструкция по включению журналирования:


# gjournal label /dev/ad0
# gjournal load
# newfs /dev/ad0.journal
# mount -o async,gjournal /dev/ad0.journal /mnt

_http://groups.google.ru/group/fa.freebsd.current/msg/1efcf3177bb109c9
mrak
FreeBSD Quickie: Keeping Your Ports Updated


Today I'm going to share with you the quick and easy way to keep your ports tree updated in FreeBSD. We'll also look at updating the ports themselves.

The first thing you need to do is make sure you have the cvsup and portupgrade utilities installed. You can find them at /usr/ports/net/cvsup-without-gui and /usr/ports/sysutils/portupgrade. Now that you have made sure those are installed, you need to create a ports-supfile. I like to keep mine at /usr/local/etc/ports-supfile, so I'll assume you will keep yours there as well. Fire up your favorite editor and edit the file to look like:
vi:
*default tag=.
*default host=cvsup3.FreeBSD.org
*default prefix=/usr
*default base=/usr/local/etc/cvsup
*default release=cvs delete use-rel-suffix compress

ports-all

You should change the host to reflect a mirror that is located near you. A list of mirrors can be found here.

Now, let's create a script to do the update, take care of a little maintenence, and email us the ports that need updating.
Script:
#!/bin/sh

/usr/local/bin/cvsup -L0 /usr/local/etc/ports-supfile
/usr/local/sbin/portsdb -Uu > /dev/null
/usr/local/sbin/portversion | grep '<'

I've saved that script as /root/cvsup.sh. The first command updates the ports tree. The utility portsdb updates the ports database file and the index. The portversion command lists all the ports installed and if they are out of date, it lists a < symbol next to them. We grep for that symbol to find only the out of date ports.

Now, let's schedule the script via crontab. Add the following to your root's crontab:
crontab:
MAILTO=youremail@yourdomain.com
45 0 * * * /root/cvsup.sh

Now, the cvsup.sh script will run every day at 45 minutes after midnight. You'll receive an email listing the ports that need to be updated. You can now log into your server and run the following for each individual port:

Bash:
/usr/local/sbin/portupgrade {port name}

Or, you can run this single command to upgrade all ports that need to be updated:
Bash:
portupgrade -aiRr

Personally, I prefer to do them one at a time. I'm just a control freak. You could also have your ports upgraded via cron, but that same control freak within me is screaming at me to not say any more about it.
mrak
Ротация журналов

Автор: Станислав Лапшанский, slapsh@kos-obl.kmtn.ru

Статья является переводом текста Майкла Лукаса (Michael Lucas).

Файлы журналов растут. Собственно говоря для этого они и предназначены. Как системный администратор, вы должны иметь способ контролировать их рост. Для этого FreeBSD имеет стандартное средство - newsyslog.

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

По умолчанию система настроена на запуск newsyslog один раз в час, это делается при помощи демона cron. Newsyslog читает конфигурационный файл /etc/newsyslog.conf и проверяет каждый указанный там файл журнала. При совпадении указанного условия производится ротация соответствующего журнала.

В файле /etc/newsyslog.conf каждая строка содержит конфигурацию ротации для одного файла журнала. В начале каждой строки указывается полное имя файла журнала, например /var/log/httpd-error.log.

Далее идет необязательное поле, которое, кстати не используется в поставляемом вместе с системой newsyslog.conf, это список из владельца и группы файла, разделенных двоеточием. Вот так: "root:wheel". Newsyslog может изменять владельца и группу и старых файлов журналов. По умолчанию владельцем устаревших журналов является пользователь root, группы wheel. Эту возможность вы можете с успехом применять на многопользовательских машинах.

Вы можете указать изменение только владельца, или только группы. В этом случае вы должны будете использовать двоеточие с пустым местом там, где должен находиться неизменяемый параметр. Например ":www" сменит группу на "www", а "user827:" заменит владельца на "user827".

Третье поле содержит режим доступа к устаревшим файлам журналов в стандартном трехциферном Unix-формате.

Далее идет счетчик, указывающий newsyslog на количество хранимых устаревших журналов. Newsyslog начинает отсчет файлов с нуля. В то время как большинство программ начинают считать с нуля, newsyslog включает 0 <по умолчанию> и считает файлы не учитывая нулевой. По умолчанию для журнала /var/log/massages счетчик равен пяти, при этом /var/log содержит следующие файлы:

messages
messages.0.gz
messages.1.gz
messages.2.gz
messages.3.gz
messages.4.gz
messages.5.gz

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

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

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

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

Пока все просто, правда?

Шестое поле, указывающее время, заставляет плакать новичков в системном администрировании. Поле времени может содержать данные четырех типов: <звездочку>, число или два различных формата даты.

Если вы не хотите производить ротацию журналов в определенное время, просто поставьте в это поле <звездочку>.

Если в поле будет число, то newsyslog будет проводить ротацию по прошествии указанного количества часов. Например, если вы хотите, что бы ротация проводилась каждые 24 часа, и вам не важно в какое именно время, то просто поставьте в это поле число <24>.

Если поле начинается символом <@>, то считается что время представлено в формате ISO-8601, этот стандарт используется newsyslog в большинстве Unix-подобных операционных систем. Этот формат использовался первой версией newsyslog разработанной в MIT (Массачусетский Технологический Институт - прим. переводчика). На первый взгляд этот формат не совсем понятен. Но, поскольку это стандарт, FreeBSD его поддерживает.

Полная запись даты в формате ISO-8601 состоит из 16 цифр с буквой <T> в середине. Первые четыре цифры означают год, следующие две - месяц, и еще две - день месяца. Буква <T> идет после даты, отделяя ее от времени, как десятичная точка в вещественных числах отделяет дробную часть от целой. После буквы <T> идут две цифры часа, затем две цифры минут и наконец две цифры секунд. Например дата 2 февраля 2002 года, 21:15:08, в формате ISO-8601будет выглядеть следующим образом:

20020202T211508

Вы обязательно должны ставить букву <T> в ISO-8601-дате.

Указание полных дат в формате ISO-8601 просто и очевидно. Путаница начинается, когда вы не пишете полную дату. Вы можете указать поля даты только рядом с буквой <T>, оставив остальное место незаполненным. Все неуказанные поля не будут учитываться при сравнении.

Например T23 значит - любой день в году, 23:00. Если вы напишете в newsyslog.conf @T23, то ротация этого журнала будет проводиться каждый день, ровно в 23:00. Запись 4T00 значит полночь 4 числа каждого месяца, таким образом @4T00 будет запускать ротацию в это время.

Так же как при работе с crontab вам следует уточнить часы ротации. Указание даты типа @7T будет запускать ротацию один раз в час, каждый час седьмого числа каждого месяца. Таким образом такая дата будет запускать ротацию раз в час на протяжении целого дня. Это может быть полезно для отладки, но вряд ли пригодится в реальной жизни.

Эта система имеет одну серьезную проблему - она не дает простого способа задавать ежедневно выполняемые задачи. Желание запустить ротацию журнала по понедельникам, не является чем-то необычным. Запустить ротацию журнала в последний день месяца таким образом вообще не удастся. Тут на помощь приходит второй формат времени.

Если запись времени начинается со знака доллара "$", то считается, что время задается в специфическом FreeBSD-формате <месяц-неделя-день>. Это очень похоже на cron и позволяет вам установить конкретные дни недели для выполнения задачи.

Этот формат использует три буквенных идентификатора: M (день месяца), W (день недели), H (час дня). После каждого из них идет число, указывающее точное время запуска. Часы находятся в интервале от 0 до 23, дни недели от 0 (воскресенье), до 6 (суббота). Дни месяца: от 1 и до количества дней в конкретном месяце.

Например для запуска ротации каждое воскресение в 8 утра вам следует задать время как $W0H8. Если вы захотите ротировать журналы в полдень 5 числа каждого месяца, то напишите $M5H12.

Одна интересная функция этой системы позволяет вам автоматически задавать ротацию на последний день месяца используя специальный <день месяца> - <L> (от last - последний. Прим. переводчика). Без этого знака было бы очень трудно задать ротацию журнала в последний день месяца без написания скрипта, который бы вставлял количество дней в конкретном месяце. Если вы хотите запустить ротацию вашего журнала аккаунтов за два часа до начала нового месяца, вы должны использовать запись $MLH22.

После того, как вам удалось точно указать время ротации, перейдем к полю флагов. Это поле необязательно для большинства журналов, однако для некоторых оно жизненно важно. Newsyslog вставляет сообщение <logfile turned over> в каждый вновь созданный файл журнала. Если журнал ведется в двоичном виде (как например /var/log/wtmp), то добавление такого сообщения обязательно его испортит. Флаг <B> запрещает newsyslog'у вставлять это сообщение.

Большинство журналов ведется в текстовом формате. Сжатие таких файлов сохранит много пространства на вашем диске. Флаг укажет newsyslog, что старые журналы следует сжать gzip'ом.

Одновременно допускается использовать только один из этих флагов.

Следующее поле задает путь к <pid-файлу> процесса пишущего журнал. Использование pid-файлов является простым способом записи поля ID процесса в системе, так что бы другие программы могли его легко прочитать. Большинство программ хранят свои pid-файлы в каталоге /var/run - поглядите них у себя на машине. Если в этом поле вы укажете полный путь к pid-файлу, то newsyslog будет посылать сигнал этому процессу когда будет производиться ротация. Например веб-сервер Apache должен быть оповещен при ротации его журналов. Записав в этом поле полный путь к его pid-файлу вы заставите newsyslog посылать процессу Apache сигнал kill -1, что бы он запустил свою часть обработки ротации журналов.

Большинство программ поддерживают ротацию журналов сигналом kill -1 или SIGHUP. Некоторые программы требуют специального сигнала, когда их файлы ротируют. Если вы используйте программу такого типа, то укажите номер необходимого сигнала в последнем поле.

Давайте соберем все сказанное вместе, в самом худшем случае, в примере, в который трудно поверить. Итак у вас есть журнал базы данных, который вы хотите ротировать в 23 часа в последний день каждого месяца. В документации базы данных сказано, что вы должны послать процессу базы сигнал прерывания (SIGINT или сигнал номер 2) после ротации. Вы хотите, что бы архивные журналы принадлежали пользователю "dbadmin" и читать их мог только он. Более того, журналы - двоичные файлы и должны быть не тронуты newsyslog'ом. Ваш newsyslog.conf должен выглядеть следующим образом:

/var/log/database dbadmin: 600 30 * $MLH23 B /var/run/db.pid 2

Это крайний случай, в большинстве реальных ситуаций вам следует только собрать имя файла и условие ротации. Всего-то.
mrak
Загрузка файлов и портов через прокси

в /etc/make.conf

FETCH_ENV=HTTP_PROXY=http://192.168.0.1:8080 HTTP_PROXY_AUTH=basic:*passwd
FETCH_ENV=FTP_PROXY=ftp://192.168.0.1:8080 FTP_PROXY_AUTH=basic:*passwd
mrak
FreeBSD и безопасность

Кто должен читать этот документ?
Каждый, кто хочет узнать больше о мерах, как сделать систему более безопасной.

Организация сети
inetd (Inet Демон)

Организация сети играет очень важную роль в общей системной безопасности. FreeBSD базируется на 4.4BSD, в которой встроена поддержка сети и действительно имеет один из наиболее мощных и быстрых TCP/IP стеков. Стек обеспечивает поддержку многих протоколов таких как telnet, ftp, talk, rsh, и т.п..

Основной файл конфигурации находится в /etc и называется inetd.conf.
Я буду использовать редактор vi в этих примерах.

Когда Вы откроете файл в редакторе, Вы увидите простой текст ASCII, который сообщает inetd как запускать тот или иной сервис, от имени какого пользователя запускается данный сервис и т.п. (смотрите man 5 inetd.conf).
Поскольку этот файл - основной файл, который запускает все сетевые сервисы, очень важно правильно его сконфигурировать. Чтобы выключить сервис, Вы должны установить "#" в начале строки. Вообще, размещение "#" в начале строки в любом из конфигурационных файлов UNIX-систем, исключает эту строку.

Основной практический метод: выключить сервисы, с которыми Вы незнакомы. В идеале, в inetd.conf может и не быть ни одной записи.
Небольшой пример:
Вы делаете web-сервер, т.е. Вам достаточно выполнять на этой машине 2 сервиса: ssh и httpd, и НИЧЕГО БОЛЕЕ.

Информация о ssh следует ниже.
Если Вы решите не использовать демонов в файле inetd.conf, то, Вы можете просто выключить inetd. Для того, чтобы cделать это, отредактируйте /etc/rc.conf файл и измените:

inetd_enable="YES"
на
inetd_enable="NO"

В этом случае никто несможет использовать telnet, rlogin или ftp для доступа к вашему компьютеру.
Если Вы хотите использовать inetd, рассмотрите возможность использования tcp wrappers. Более подробную информацию Вы можете найти на ftp://ftp.win.tue.nl/pub/security/index.html#software

Если Вы решили оставить inetd, регистрируйте и по мере надобности увеличивайте количество соединений в одну минуту (по-умолчанию - 256, я рекомендую 1024 - установите это значение как посчитаете нужным).
Небольшое дополнение: если у Вас "медленное" соединение (например, модем), это неважно, но если у вас быстрое соединение (64k), этим параметром могут воспользоваться для создания атаки DoS (Denied of Service). Злоумышленник может создать простой shell-сценарий, чтобы спровоцировать более 256 соединений с вашим компьютером, которые заставят inetd отключить этот сервис. С другой стороны, если Вы хотите поддержать одновременно 1024 соединений - Вы должны правильно сконфигурировать inetd, в противном случае кто-нибудь может также вызвать DoS (Denied of Service) и повредить ваш компьютер. Следовательно, конфигурационный файл /etc/rc.conf должен содержать следующее:

inetd_enable="YES"
inetd_flags="-l -R 1024"

это включит регистрацию (ключ -l) и максимальное количество будет увеличено до 1024.

Вам также следует изменить ваш файл /etc/syslog.conf в директории /etc, но об этом мы поговорим позже, при рассмотрении syslogd.

SSH (Secure SHell)
Я упомянул выше, что в некоторых случаях Вы, возможно, не будете выполнять inetd.
Например, если Вы поддерживаете Web, News или NFS, нет необходимости включать другие сервисы на машине. "Как же мне управлять моей машиной?" - спросите Вы. Ответ: SSH. Вы можете войти в систему, используя SSH (Secure Shell).

Secure Shell был разработан как альтернатива rsh, rlogin и других Berkeley r* команд, но SSH можно использовать и вместо таких приложений как telnet и ftp. У SSH много характеристик, но его по большей части используют для шифрования соединения, чтобы предохранить явные текстовые пароли и остальную часть данных, путешествующие в "чистом виде". Если Вы используете telnet, ваше соединение может было подсмотрено. (Если Вы думаете, что S/Key является решением, то должен Вас огорчить: в этой реализации все еще существуют проблемы вставки данных и захвата соединения.)

Я надеюсь, что теперь Вы созрели, для того, чтобы выключить inetd полностью и установить SSH. Если Вы думаете, что не сможете жить без услуг предусмотренных inetd, тогда, по крайней мере, включите регистрацию (логирование) и увеличте до максимума количество соединений в минуту.
Загрузить SSH можно с ftp://ftp.funet.fi/pub/unix/security/login/ssh или (что проще):

# cd /usr/порты/security/ssh
# make install

Если у Вас есть не-Unix клиенты, то для Windows SSH можно получить здесь:

http://fox.doc.ic.ac.uk/~ci2/ssh/
http://www.zip.com.au/~roca/ttssh.html
SecureCRT от http://www.vandyke.com

Inetd (часть II)

telnetd
Итак, Вы все еще хотите использовать inetd.
Давайте посмотрим на опции в inetd.conf, которые помогут сделать услуги более безопасными.
Нападающий сначала соберет информацию о сети или системе, которую он собирается атаковать. Первое, что Вы можете сделать, чтобы предохранить себя от взлома, добавить ключ "-h" для telnet демона:

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h

Что написано в манах ???

#man telnetd
......
-h Не выводить специфической информации о машине прежде, чем вход в систему будет завершен.
......

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

#telnet stream tcp nowait root /usr/libexec/telnetd telnetd

Дополнительно можно добавить ключ "-U" для telnet демон, которые устанавливает соединение, только в случае если об этом хосте есть запись в DNS:

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U

Это немного поможет увеличить общую безопасность вашей системы.

ftpd
Теперь давайте посмотрим на ftpd.
У FreeBSD есть демон ftp сконфигурированный таким образом, чтобы делать некоторую регистрацию (логирование). Вы увидите, что ftpd запускается с ключом "-l" из inetd.conf. Вам также следует сконфигурировать ваш syslogd (syslog демон), чтобы обеспечить поддержку для протокола сгенерированного демоном ftp.
Что написано в манах?

# man ftpd
.....
-l Каждый сеанс ftp(1) зарегистрирован используя syslog со средством LOG_FTP.

Если эта опция определена дважды, то: retrieve (get), send (put),

append, delete, make directory, remove directory, а также операции переименовывания

и их аргументы будут зарегистрированы !!!.

Примечание: по умолчанию, сообщения LOG_FTP не отображаются syslogd(8)...

.....

Разрешим ftpd протоколировать свои действия. В файл /etc/syslog.conf (также `man 5 syslog.conf`) добавьте следующую строку:

ftp.* /var/log/ftpd

Запустите команду

# touch /var/log/ftpd

т.к. syslogd не может создавать файлы.

Не забывайте добавлять имя нового log-файла в другой конфигурационный файл /etc/newsyslog.conf, чтобы заставить демон периодически менять файлы.

Если Вы хотите увидеть более подробную информацию о вашем демоне ftp, просто добавьте еще один символ "-l" в строку ftp в /etc/inetd.conf:

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l

Вместо стандартного UNIX-протокола ftp следует использовать команду scp (Secure Copy, которая является частью пакета SSH), но если Вы все еще хотите оставить анонимный доступ ftp, запустите ваш демон ftp с ключем "-A":

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A

Вы можете также отредактировать /etc/ftpwelcome, чтобы предупредить о том, что ftpd допускает только анонимные соединения и, что зарегистрированиные пользователи должны использовать scp вместо ftp. Если Вы разрешите анонимный доступ по ftp, то, следует использовать ключ -S, для того, чтобы регистрировать анонимные соединения по ftp:


ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S

fingerd
Сервис finger поставляется сконфигурированным по умолчанию: он не допускает запросы без имени пользователя. И это правильно. Если вы хотите отказатся от выполнения услуги finger, установите комментарий (символ "#" в начале строки). Если Вы хотите выполнять сервис finger, разрешите регистрацию добавив ключ "-l":

finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l

Протоколы от fingerd по умолчанию поступают в /var/log/messages. Если Вы хотите иметь протокол демона finger в другом файле, добавьте следующую строку к вашему /etc/syslog.conf файлу:

daemon.notice /var/log/fingerd

Что в манах???

$ man 5 syslog.conf

Я обычно запрещаю выполнение talk и comsat, а также другие сервисы которые мне лично не нужны. Как я говорил ранее, если вы не знаете что делает тот или иной сервис, или он Вам не нужен - отключайте его выполнение.

Некоторые маны, в которых Вы могли найти полезную и имеющую отношение к сетевой конфигурации:


inetd, ftpd, telnetd, fingerd, syslogd, comsat, talkd, rshd, rlogind, и inetd.conf.

Смотрите также на ссылки ("SEE ALSO") указанные на этих страницах.

ipfw (IP FireWall)
IP Firewall фильтрует пакеты: ни больше, ни меньше.
Тем не менее, Вы должны рассмотреть поддержку ipfw в ядре. Я обычно компилирую поддержку для ipfw в большинстве своих машинах, и в большинстве моих ядер config выглядит приблизительно так:

options IPFIREWALL #finger
options IPFIREWALL_VERBOSE #log
options IPFIREWALL_DEFAULT_TO_ACCEPT

Первая строка включает в ядро основную IP Firewall поддержку.
Вторая строка конфигурирует ipfw, чтобы зарегистрировать принятые или отвергнутые пакеты.
Третья строка делает точно что сказано: принять любые соединения и пакеты от всех по умолчанию. Если не будет этой строки, ifpw отвергнет все пакеты по умолчанию.

Примечание.
ИСКЛЮЧИТЕ ОПЦИЮ ЕСЛИ ВЫ НЕ ЗНАЕТЕ ЧТО ИЛИ НЕ ПОНИМАЕТЕ ЧТО ДЕЛАЕТЕ!!! Это неправильный метод в конфигурирования firewall'а. Все пакеты должны быть отвергнуты по умолчанию. НЕ добавляйте опцию IPFIREWALL_DEFAULT_TO_ACCEPT если Вы строите безопасную систему или firewall. Убедитесь, что сначала все пакеты отвергнуты по умолчанию, а только после используйте правила дополнения, чтобы допустить соединения/пакеты. Смотрите /etc/rc.firewall для более подробной информации.
Небольшое обозрение по /etc/rc.firewall и примерные файлы конфигурации, а также схему установки firewall'а - смотрите URL внизу страницы.

log_in_vain
Вы можете также изменить некоторые полезные переменные ядра через команду sysctl:

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

Это обеспечит Ваc регистрацией предпринимаемых соединений, которые сервер не умееет выполнять.
Например, если Вы не имеете сервер DNS на вашем компьютере и кто-то пытается использовать ваш компьютер как DNS, Вы увидите нижеследующее сообщение:


Connection attempt UDP yourIP:53 from otherIP:X (где X - некоторый порт >1023)

Это сообщение можно увидеть с помощью команды

# dmesg

dmesg показывает системный буфер сообщений ядра. Но в буфере содержится небольшое количество сообщений. Эти же сообщения регистрируются в /var/log/messages


# tail -1 /var/log/messages

Jun 12 19:36:03 machi /kernel: Connection attempt UDP yourIP:53 from otherIP:X

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


$ netstat -na | grep LISTEN

эта команда сообщит Вам какие порты имеют сервисы, ждущие соединение. Чем меньше - тем лучше :) Тот, кто будет выполнять сканирование портов, чтобы обнаружить какие порты у вас открыты - увидит тоже самое. Также убедитесь, что syslog действительно регистрирует сообщения:


# cd /var/протокол

# tail -10 fingerd ftpd messages

Если Вы не видите что-либо в ваших протоколах, убедитесь, что, Вы перезапустили inetd и syslogd процессы:

# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`

Файловые системы
Поскольку в UNIX все считается файлом, очень важно правильно защищать ваши файловые системы. Этот процесс начинается прежде, чем установка самой OS: Вам нужно вычислить и разбить жесткий диск на разделы.
О чем стоит задуматься и что Вы должны знать?
Первое. Вы можете монтировать разные файловые системы разными параметрами. (некоторые примеры ниже).
Второе. Возможно Вы захотите экспортировать файловые системы, тогда Вы будете иметь более прозрачное управление.

Если Вы пришли из Linux-мира, обратите внимание, что пока Linux устанавливает всю ОС на один корневой раздел "/", FreeBSD по умолчанию делает установку в три файловых системы "/", "/usr" и "/var". Это облегчает использование некоторых программ (например, команда dump).

Есть некоторые преимущества и в безопасности.
Одна из таких вещей, которые я обычно делаю - разделение разделов на области, где пользователи имеют право писать и области, где пользователи не имеют право писать. Области, где пользователи имеют право писать, следует смонтировать с опцией "nosuid". Итак, Вы должны иметь один раздел для директорий пользователей: /home или /usr/home. Также Вы можете создать отдельный раздел для /var/tmp, а после указать ваш /tmp на этот раздел:

# rm -rf /tmp

# ln -s /var/tmp /tmp

Например, Вы можете сделать следующее:

# cat /etc/fstab

# Device Mountpoint FStype Options Dump Pass

#

/dev/sd0s1b none swap sw 0 0

/dev/sd0s1a / ufs rw 1 1

/dev/sd0s1g /usr ufs rw 2 2

/dev/sd0s1h /usr/home ufs rw,nosuid 2 2

/dev/sd0s1f /var ufs rw 2 2

/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2

proc /proc procfs rw 0 0

Вам следует убедиться, что все директории где пользователи могут писать, или установлены в "nosuid" или с помощью chmod в такое положение, что пользователи ничего не смогут написать. По умолчанию во FreeBSD это можно сделать с /var/spool/uucppublic или Вы можете установить вашу файловую систему "/var" в положение "-nosuid".


# chmod o-w /var/spool/uucppublic

Если Вы хотите найти все ваши директории исполнительного листа, выпустите:


# find / -perm -0777 -type d -ls

Как обнаружить какие файлы устанавливаются в вашей системе как suid или guid? Поищем с помощью find(1):


# find / -perm -2000 -ls

# find / -perm -4000 -ls

Вы можете не использовать ключ "-ls" для более компактного вывода. Один из самых простых способов - сделать "chmod 000" на тех бинарных файлах, которые никогда не будете использовать. Обычно это касается uustat, uucico (если Вы никогда не будете пользоваться uucp). Это касается и ppp, и pppd в том случае, если Вы не собираетесь использовать на этой машине PPP. Если Вы не собираетесь печатать с этой машины или на эту машину, Вы можете установить "chmod 000" на lpr, lprq, lprm. Здесь Вы можете спросить: что может остановить хакера от простого демонтирования и последуюшего монтирования без флага "-nosuid"? Да, ничто, пока Вы не измените securelevel.

Securelevel
Ядро BSD имеет такое понятие, как securelevel. Пока некоторые спорят о том, правильно это или нет, следует применять это или нет, попробуем разобраться в чем тут дело. Securelevel - это уровень защиты, с которым выполняется ядро. Разные уровни подразумевают под собой разные методы проверки защиты системы. Очень туманно...

# man 8 init

Ядро работает с четырьмя другими уровнями безопасности.

Любой процесс суперпользователя может поднять уровень безопасности,

но только init может уменьшить его. Уровни безопасности:

-1 Всегда небезопасный режим. Запускайте систему на уровне 0.

0 Небезопасный режим. Флаги неизменения и добавления могут быть выключены.

Со всеми устройствами можно производить операции записи и чтения в

подлежащим их разрешениям.

1 Безопасный режим. Система неизменная и системное добавление-только флаги не

может быть выключено; диски для монтирования файловых систем, устройства /dev/mem,

и /dev/kmem не могут быть открыты для записи.

2 Очень безопасный режим. Тоже, что и безопасный режим. Дополнение: диски не могут

открываться для записи (исключая команду mount(2)) внезависимости от

от того смонтированы они или нет.

Этот уровень предотвращает подделку файловых систем демонтируя их,

но также томозить прогон newfs(8) пока система многопользовательская.

Если уровень безопасности первоначально -1, то init оставит это неизменным.

В противном случае, init размещает, чтобы выполнять систему на уровне 0

в однопользовательском режиме и уровне 1 для многопользовательского

режима. Если Вам нужен уровень 2 - то его можно устанавить в

однопользовательском режиме, например, в сценарии запуска /etc/rc,

используя sysctl(8).

Например, если ваша система - Web-сервер, Вы можете благополучно установить ваш securelevel равный 2. Но, если Вы запускаете X-сервер, установка securelevel на 1 или выше могут вызвать проблемы, поскольку X-серверу требуется открывать /dev/mem и /dev/kmem для записи, а securelevel 1 запрещает выполнять эти операции. Правда можно сделать и так: установить ваш securelevel после того, как Вы запустили X-сервер, но если Вы запустили X-сервер, у вас уже есть другие серьезные вопросы по безопасности, нежели беспокойство о securelevel. Узнаем об установленном securelevel:


# sysctl kern.securelevel,

чтобы поднять ваш securelevel:


# sysctl -w kern.securelevel=X

где X - 0, 1 или 2.

У Вас могут возникать проблемы, если Вы модернизируете вашу систему с помощью "make world" или если Вы пересобираете ядро, при работе с securelevel 1 или выше. Дело в том, что по умолчанию "make install" установит ваше ядро с системным неизменным флагом:


# ls -lo /kernel

-r-xr-xr-x 1 root wheel schg 1061679 Июня 30 01:27 /kernel

Это "schg" предохраняет Ваше ядро:


# id

uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)

# sysctl kern.securelevel

kern.securelevel: 2

# rm -rf /kernel rm: /kernel: Operation not permitted

# mv /kernel /tmp/

mv: rename /kernel в /tmp/kernel: Operation not permitted

Если Вы работаете в securelevel 1 или 2, этот флаг не может быть выключен:


# chflags noschg /kernel

chflags: /kernel: Operation not permitted

Должен также отметить, что файл /boot.config может использоваться, чтобы изменить ядро, используемое при загрузке. Для того, чтобы это было невозможно сделать, следует следует сделать следующее:


# touch /boot.config

# chflags schg /boot.config

По умолчанию Вы будете также иметь некоторые двоичные включенные с schg флагом установленным в вашей системе:


# ls -lo /sbin | grep schg

-r-x------ 1 bin bin schg 204800 Июля 19 20:38 init

# ls -lo /bin | grep schg

-r-sr-xr-x 1 root bin schg 192512 Июля 19 20:36 rcp

Поскольку мы поговорили о системных неизменных флагах, можно рассматреть случай выполнения chflags schg на поддеревьях /sbin и /bin. Это сделает более трудным доступ к "черным ходам" в вашей системе (особенно при использовании securelevel).


# chflags schg /bin/*

# chflags schg /sbin/*

Поскольку /sbin может быть перемещен и после этого создан новый /sbin, следует провести туже самую операцию над каталогами:


# chflags schg /bin; chflags schg /sbin

Помните! Если вы сделали достаточно много изменений на файловых флагах - это обязательно, в свою очередь, повлечет за собой проблемы при "make world". В этом случае можно предложить сделать "make world" в однопользовательском режиме. Дополнительную информацию о "make world" можно прочитать здесь:
http://www.nothing-going-on.demon.co.uk/Fr...make-world.html

Маны, связанные с вышеуказанными темами: init(8), chflags(1), sysctl(8)
Te0s
Неспешно готовимся к выходу 6.2-RELEASE

BETA1 - 17 сентября
BETA2 - 1 октября
RC1 - 15 октября
RC2 - 29 октября
RELEASE - 13 ноября
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2010 Invision Power Services, Inc.