понедельник, 26 ноября 2012 г.

суббота, 20 октября 2012 г.

Samba на Debian


cat /etc/samba/smb.conf
[global]

    bind interfaces only = yes
    workgroup = WORKGROUP          #Укажите здесь имя рабочей группы 
    netbios name = server2         
    server string = %h
    security = SHARE
    null passwords = Yes
    guest ok = Yes
    browseable = Yes
    guest account = nobody 
    public = yes
    domain master = no
    local master = no
    preferred master = no
    os level = 0
    usershare allow guests = yes

#Public read/write
[pub]                     #Эта секция описывает директорию с публичным доступом
    path = /srv/smb/pub/           #которую все могут читать и писать
    browseable = Yes
    guest only = Yes
    read only = no    
    writable = yes
    create mask = 0644

#Archive read only        #Эта секция описывает директорию с публичным доступом
[Archive]                 #которую все могут читать но никто не может писать 
    path = /srv/smb/archive/
    browseable = Yes
    guest only = Yes
    read only = Yes
    writable = No
    create mask = 0644

#Archive read/write hidden  #Эта секция описывает директорию с публичным доступом
[Archive_rw]              #которую все могут читать и писать, но не отображается 
    path = /srv/smb/archive/  #в списке ресурсов то есть если чтобы зайти в неё  
    browseable = No           #нужно будет указать полный путь к ней
    guest only = Yes          #пример для Linux smb://server/archive_rw/
    read only = no            #пример для Winndows \\server\archive_rw\
    writable = yes
    create mask = 0644



http://sc0rp1us.blogspot.com/2012/01/samba-debian.html

вторник, 16 октября 2012 г.

squidview

  • l    — enter — генерация отчета, вы также можете настроить дополнительные настройки
  • T   — начинется учет статистики по размеру скачиваемого
  • O  — просмотре кто чё качал по юзерам, после T

вторник, 2 октября 2012 г.

iptables features

Makes iptables wait 15 seconds between new connections from the same IP:
iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Same, but with counting of attempts: 
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH 
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP 

Block Well-Known TCP Attacks

Blocking portscan

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP


Spoofed/Invalid packets

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

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

Block Smurf attacks

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT


Optimize netfilter's Performance Using ipset

If you write a lot of similar rules based on mere IP, port, or both, consider using ipset to optimize netfilter's performance.
For example:
iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT
This means that a packet with the source address of 192.168.251.177 must first traverse hundreds of rules before it can get its verdict of ACCEPT.
Of course, experienced sysadmins will split the rules by subnet. But that still means hundreds of rules.
ipset to the rescue!
First, define an IP Set of ipmap type:
ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16
Then, populate it with the addresses:
for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done
Finally, replace the hundreds of iptables rules above with one rule:
iptables -m set --match-set Allowed_Hosts src -j ACCEPT



http://serverfault.com/questions/245711/iptables-tips-tricks

четверг, 6 сентября 2012 г.

Отключение IPv6

В первую очередь, необходимо отредактировать файл /etc/modprobe.d/aliases:
$ sudo vim /etc/modprobe.d/aliases
И привести его, к следующему виду:
alias net-pf-10 ipv6 off
alias net-pf-10 off
alias ipv6 off
Если в файле присутствует строка "alias net-pf-10 ipv6", то ее необходимо закомментировать.
Далее, отключаем IPv6 в ядре:
$ echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6
А так же, добавляем строчку эту операции в автозагрузку. Скрипт /etc/rc.local должен выглядеть приблизительно следующим образом:
$ tail /etc/rc.local 
#....
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
#
# By default this script does nothing.
exit 0
Далее, блокируем загрузку соответствующего модуля:
$ echo "blacklist ipv6" | sudo tee -a /etc/modprobe.d/blacklist
# в зависимости от версии, может быть и так:
# echo "blacklist ipv6" | sudo tee -a /etc/modprobe.d/blacklist.conf
И наконец, прописываем в grub опцию, отключающую загрузку IPv6 ():
$ sudo vim /boot/grub/menu.lst
Если, допустим, конфигурация загрузки у Вас выглядит так:
title           Ubuntu 9.10, kernel 2.6.31-20-generic
uuid            08b70bd0-5a61-4f9c-a8b8-464c5beb48e2
kernel         /boot/vmlinuz-2.6.31-20-generic root=UUID=08b70bd0-5a61-4f9c-a8b8-464c5beb48e2 ro nohotplug quiet splash
initrd          /boot/initrd.img-2.6.31-20-generic
quiet
то после редактирования конфигурация grub должна выглядеть так:
title           Ubuntu 9.10, kernel 2.6.31-20-generic
uuid            08b70bd0-5a61-4f9c-a8b8-464c5beb48e2
kernel          /boot/vmlinuz-2.6.31-20-generic root=UUID=08b70bd0-5a61-4f9c-a8b8-464c5beb48e2 ro nohotplug quiet splash ipv6.disable=1
initrd          /boot/initrd.img-2.6.31-20-generic
quiet
Все. Теперь необходимо перезагрузить компьютер. И убедиться, что нет никаких сетевых соединений, использующих IPv6:
$ sudo netstat -npl | grep -E "tcp6|udp6" | wc -l
 
 
 
http://debianworld.ru/articles/otklyuchenie-ipv6-v-ubuntu-debian/ 

пятница, 24 августа 2012 г.

Восстановление пакетов из бэкапа

Файлик dpkg.list позволяет быстро установить все необходимые пакеты 
(перед этим лучше сначала перенести учётные записи).





Пулучаем писок установленных пакетов 
dpkg --get-selections > /root/backups/dpkg.list 
 
Установка пакетов 
dpkg --set-selections < dpkg.list
apt-get dselect-upgrade 

вторник, 21 августа 2012 г.

Usefull zabbix UserParameters

# Network: ARP entries [Entries]
 
UserParameter=arp.entries,grep -c -v 'HW type' /proc/net/arp
 
# System: CPU speed []
 
UserParameter=cpuspeed.core0,grep MHz /proc/cpuinfo | head -n 1 | cut -c 12- | awk '{ sum += $1 } END { print sum }'
UserParameter=cpuspeed.core1,grep MHz /proc/cpuinfo | tail -n 1 | cut -c 12- | awk '{ sum += $1 } END { print sum }'
 
# System: HDD SMART Temperature
 
UserParameter=hdd_smart_temp[*],smartctl -a /dev/$1 |awk '/194 Tempera/ {print $4}'
 
# Detailed process count
 
UserParameter=processes_uninterruptible,ps axo state= |grep -c D
UserParameter=processes_runnable,ps axo state= |grep -c R
UserParameter=processes_sleeping,ps axo state= |grep -c S
UserParameter=processes_stopped,ps axo state= |grep -c T
UserParameter=processes_paging,ps axo state= |grep -c W
UserParameter=processes_dead,ps axo state= |grep -c X
UserParameter=processes_zombie,ps axo state= |grep -c Z
 
# Number of process forks per second
 
UserParameter=processes_forks,awk '/processes/ {print $2}' /proc/stat
 
# Available entropy
 
UserParameter=entropy,cat /proc/sys/kernel/random/entropy_avail
 
 
# WiFi level, noise, and network values
 
# Quality - link : general quality of the reception.
UserParameter=wifi_quality,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $4; }' /proc/net/wireless
# Quality - level : signal strength at the receiver.
UserParameter=wifi_level,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $5; }' /proc/net/wireless
# Quality - noise : silence level (no packet) at the receiver.
UserParameter=wifi_noise,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $6; }' /proc/net/wireless
# Discarded - nwid : number of discarded packets due to invalid network id.
UserParameter=wifi_d_nwid,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $7; }' /proc/net/wireless
# Discarded - crypt : number of packet unable to decrypt.
UserParameter=wifi_d_crypt,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $8; }' /proc/net/wireless
# Discarded - misc
UserParameter=wifi_d_misc,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $11; }' /proc/net/wireless
# Missed Beacons
UserParameter=wifi_mbeac,awk -F'[ :]*' '/:/ {gsub(/\. /," ",$0); print $12; }' /proc/net/wireless
 
# Networking: Connection tracking
 
UserParameter=conntrack_established,sudo grep -c ESTABLISHED /proc/net/ip_conntrack
UserParameter=conntrack_fin_wait,sudo grep -c FIN_WAIT /proc/net/ip_conntrack
UserParameter=conntrack_time_wait,sudo grep -c TIME_WAIT /proc/net/ip_conntrack
UserParameter=conntrack_syn_sent,sudo grep -c SYN_SENT /proc/net/ip_conntrack
UserParameter=conntrack_assured,sudo grep -c ASSURED /proc/net/ip_conntrack
UserParameter=conntrack_tcp_tot,sudo grep -c ^tcp /proc/net/ip_conntrack
UserParameter=conntrack_udp_tot,sudo grep -c ^udp /proc/net/ip_conntrack
 
# Remote Ping (specify host)
 
UserParameter=rping[*],ping $2 -c1 -W5|awk -F '[ /]*' '/rtt/ {print $7}' || echo
 
# Debian: packages stats - WARNING: quite heavy processes, run it infrequently
 
UserParameter=deb_pkg_removed,grep -c '^Status: deinstall ok config-files$' /var/lib/dpkg/status
UserParameter=deb_pkg_installed,grep -c '^Status: install ok installed$' /var/lib/dpkg/status
UserParameter=deb_pkg_purged,grep -c '^Status: purge ok not-installed$' /var/lib/dpkg/status
 
# Debian: last dpkg run date - useful to spot unmantained systems
 
UserParameter=deb_dpkg_lastrun,awk 'END{print $1,$2}' /var/log/dpkg.log
 
 
# iptables: bytes processed by each firewall rule. Rule number must be specified.
 
UserParameter=iptables_input_bytes[*],iptables -nv -LINPUT|awk "NR==2+$1"|echo $((`awk '{r=$2;sub(/G/,"*1048576",r);sub(/M/,"*1024",r);print r}'`))
UserParameter=iptables_forward_bytes[*],iptables -nv -LFORWARD|awk "NR==2+$1"|echo $((`awk '{r=$2;sub(/G/,"*1048576",r);sub(/M/,"*1024",r);print r}'`))
UserParameter=iptables_output_bytes[*],iptables -nv -LOUTPUT|awk "NR==2+$1"|echo $((`awk '{r=$2;sub(/G/,"*1048576",r);sub(/M/,"*1024",r);print r}'`))

raid и smartmontools debian

Стандартная команда мониторинга состояния физических дисков не выдаст ничего полезного:
smartctl --all /dev/sda

Можно использовать arcconf, но есть и другой путь:

Решение:

Linux создает для всех физических дисков, подключенных к контроллеру виртуальные устройства с именем /dev/sgX
  • /dev/sg0 - RAID 1 controller (you will not get any info or /dev/sg0).
  • /dev/sg1 - First disk in RAID 1 array.
  • /dev/sg2 - Second disk in RAID 1 array.
  • /dev/sg3 - Third disk in RAID 1 array.
     

    Тест:

    # smartctl -d sat --all /dev/sg1 -H

    Просмотр таблиц smart

    # smartctl -d sat --all /dev/sgX
    # smartctl -d sat --all /dev/sg1

    То же самое для дисков SAS

    # smartctl -d scsi --all /dev/sgX
    # smartctl -d scsi --all /dev/sg1
    # smartctl -d scsi --all /dev/sg1 -H
     

пятница, 10 августа 2012 г.

ZYXEL ADSL console mode

wan adsl chandata              ADSL channel data, line rate
wan adsl close                   Close ADSL line
wan adsl linedata near        Show ADSL near end noise margin
wan adsl linedata far           Show ADSL far end noise margin
wan adsl open                   Open ADSL line
wan adsl opencmd             Glite Open ADSL line with specific standard
wan adsl opmode               Show the operational mode
wan adsl rateadap [on|off]   Turn on/off rate adaptive mechanism
wan adsl perfdata               Show performance information,CRC, FEC, error seconds.
wan adsl reset                   Reset ADSL modem, and must reload the modem code again
wan adsl Status                 ADSL status (ex: up, down or wait for init)

понедельник, 6 августа 2012 г.

Настройка синхронизации каталогов/файлов с помощью rsync



Устанавливаем пакет rsync на исходном (192.168.234.41) и на копируемом (192.168.234.39) сервере:
atp-get install rsync

На копируемом сервере создаем конфигурационный файл /etc/rsyncd.conf

[freeradius]
comment = For backups openvpn
path = /etc/freeradius
use chroot = true
uid = root
gid = root
log file = /var/log/rsyncd.log
read only = false
write only = false
hosts allow = 192.168.234.41
hosts deny = *
transfer logging = false


Разкоментируем запуск службы в /etc/default/rsync

# defaults file for rsync daemon mode

# start rsync in daemon mode from init.d script?
#  only allowed values are "true", "false", and "inetd"
#  Use "inetd" if you want to start the rsyncd from inetd,
#  all this does is prevent the init.d script from printing a message
#  about not starting rsyncd (you still need to modify inetd's config yourself).
RSYNC_ENABLE=true

# which file should be used as the configuration file for rsync.
# This file is used instead of the default /etc/rsyncd.conf
# Warning: This option has no effect if the daemon is accessed
#          using a remote shell. When using a different file for
#          rsync you might want to symlink /etc/rsyncd.conf to
#          that file.
# RSYNC_CONFIG_FILE=

# what extra options to give rsync --daemon?
#  that excludes the --daemon; that's always done in the init.d script
#  Possibilities are:
#   --address=123.45.67.89<----><------>(bind to a specific IP address)
#   --port=8730><------><------><------>(bind to specified port; default 873)
RSYNC_OPTS=''

# run rsyncd at a nice level?
#  the rsync daemon can impact performance due to much I/O and CPU usage,
#  so you may want to run it at a nicer priority than the default priority.
#  Allowed values are 0 - 19 inclusive; 10 is a reasonable value.
RSYNC_NICE=''

# run rsyncd with ionice?
#  "ionice" does for IO load what "nice" does for CPU load.
#  As rsync is often used for backups which aren't all that time-critical,
#  reducing the rsync IO priority will benefit the rest of the system.
#  See the manpage for ionice for allowed options.
#  -c3 is recommended, this will run rsync IO at "idle" priority. Uncomment
#  the next line to activate this.
# RSYNC_IONICE='-c3'

# Don't forget to create an appropriate config file,
# else the daemon will not start.


Стартуем службу
/etc/init.d/rsync restart

На исходном сервере добавляем запуск команды в /etc/crontab

1   *   * * *   root    rsync -au /etc/freeradius/ rsync://192.168.234.39/freeradius
30  8   * * 7   root    rsync --del -au /etc/freeradius/ rsync://192.168.234.39/freeradius


ЗЫ. Ну и не забываем в iptables открыт tcp порт 873 на на копируемом сервере

четверг, 5 июля 2012 г.

Разрешить доступ в htacces тем кто за прокси

Обычно в апачи разрешаем доступ на сайт с помощью htaccess так

Order allow,deny
Deny from all
Allow from 11.11.11.11
Allow from 22.22.22.22

Но если же нужный пользователь сидит за прокси

SetEnvIF X-FORWARDED-FOR "11.11.11.11" AllowIP
SetEnvIF X-FORWARDED-FOR "22.22.22.22" AllowIP
Order deny,allow
Deny from all
Allow from env=AllowIP

пятница, 29 июня 2012 г.

Netcat

Отображение тестовой HTML-странички клиенту с обычным браузером одной командой (порт 8080):
(echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\n\n Hello World";) | nc -vv -l -p 8080
Передача файла клиенту с обычным браузером одной командой (порт 8080):
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment; filename=целевое-имя-которое-увидит-клиент\nContent-Type: application/octet-stream\nConnection: close\n"; cat имя-файла-на-диске ) | nc -vv -l -p 8080


Как пользоваться nc? 

(http://handynotes.ru/2010/01/unix-utility-netcat.html)

Начнем с нескольких простых примеров и далее будем их использовать как базовые.
Если Вы помните, я говорил, что netcat это Швейцарский армейский нож. Чем-бы этот нож был, если бы его нельзя было использовать как обычный нож? Вот почему netcat может использоваться вместо обычного telnet:
$ nc www.google.com 80
В действительности он более удобный чем обычный telnet, потому что Вы можете завершить соединение в любое время, нажав Ctrl+C и он обрабатывает двоичные данные как обычные (никаких escape последовательностей, ничего).
Вы можете добавить параметр “-v” для более подробного вывода результатов действий, и параметр (-vv) для получения статистики о том, сколько байт было передано во время текущего сеанса соединения.
Netcat может быть использован в качестве сервера. Если Вы запустите его, как указано ниже, он будет слушать на порту 12345 (на всех интерфейсах):
$ nc -l -p 12345
Теперь если Вы подключитесь к порту 12345 этого хоста, все, что Вы набираете будет передано удаленной стороне, что говорит нам о том, что netcat можно использовать как чат сервер. Запустите на одном из компьютеров:
# На компьютере A с IP 10.10.10.10
$ nc -l -p 12345
И подключитесь к нему с другого:
# На компьютере B
$ nc 10.10.10.10 12345
Теперь обе стороны могут переговариваться!
Такой способ разговора, когда обе стороны могут разговаривать друг с другом делает возможным использование nc для операций ввода/вывода через сеть! К примеру, Вы можете послать целую директорию с одного компьютера на другой организовав tar конвейер через nc на первом компьютере, и перенаправив вывод в другой tar процесс на втором.
Предположим, Вы хотите переслать файлы из директории /data компьютера A с IP 192.168.1.10 на компьютер B (с любым IP). Это просто:
# На компьютере A с IP 192.168.1.10
$ tar -cf — /data | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 | tar -xf -
Не забудьте скомбинировать конвейер с Рipe Viewer, который был описан в предыдущей статье, что-бы посмотреть статистику того, как быстро происходит передача!
Одиночный файл может быть послан проще:
# На компьютере A с IP 192.168.1.10
$ cat file | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 > file
Вы даже можете скопировать и восстановить целый диск, с помощью nc:
# На компьютере A с IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 > /dev/hdb
Заметим: Опция “-l” не может быть использована совместно с “-p” на Mac компьютерах! Решение, — просто заменить “-l -p 6666? на “-l 6666?. Как здесь:
# теперь nc слушает на порту 6666 для Mac компьютеров
$ nc -l 6666
Незаурядное использование netcat — сканирование портов. Netcat не лучший инструмент для такой работы, но он с этим справляется (лучший, конечно-же nmap):
$ nc -v -n -z -w 1 192.168.1.2 1-1000
(UNKNOWN) [192.168.1.2] 445 (microsoft-ds) open
(UNKNOWN) [192.168.1.2] 139 (netbios-ssn) open
(UNKNOWN) [192.168.1.2] 111 (sunrpc) open
(UNKNOWN) [192.168.1.2] 80 (www) open
(UNKNOWN) [192.168.1.2] 25 (smtp) : Connection timed out
(UNKNOWN) [192.168.1.2] 22 (ssh) open
Параметр “-n” предотвращает от просмотра DNS, “-z” не ждет ответа от сервера, и “-w 1? задает таймаут для соединения в 1 секунду.
Другое нетривиальное использование netcat в роли прокси. И порт и хост могут быть перенаправлены. Посмотрите на этот пример:
$ nc -l -p 12345 | nc www.google.com 80
Эта команда запускает nc на порту 1234 и перенаправляет все соединения на google.com:80. Если теперь Вы подключитесь к этому компьютеру на порту 12345 и сделаете запрос, Вы обнаружите, что в ответ не получаете никаких данных. Это правильно, потому-что мы не установили двунаправленный канал. Если Вы добавите второй канал, Вы получите Ваши данные на другом порту:
$ nc -l -p 12345 | nc www.google.com 80 | nc -l -p 12346
После посылки запроса на порт 12345, получите Ваши данные ответа на порту 12346.
Вероятно самая мощная возможность netcat — запустить любой процесс как сервер:
$ nc -l -p 12345 -e /bin/bash
Параметр “-e” пораждает выполнение ввода и вывода перенаправляемого через сетевой сокет. Теперь, если Вы подключитесь к хосту на порту 12345, Вы можете использовать bash:
$ nc localhost 12345
ls -las
total 4288
4 drwxr-xr-x 15 pkrumins users 4096 2009-02-17 07:47 .
4 drwxr-xr-x 4 pkrumins users 4096 2009-01-18 21:22 ..
8 -rw——- 1 pkrumins users 8192 2009-02-16 19:30 .bash_history
4 -rw-r—r— 1 pkrumins users 220 2009-01-18 21:04 .bash_logout


(http://execbit.ru/2011/05/23/netcat/)
1 Передавать файлы (первую команду выполняем на принимающей машине, вторую - на передающей:
$ nc -l 31334 > filename
$ nc 172.16.69.143 31334 < filename
2 Удаленно читать логи (первая - сервер, вторая - клиент):
$ nc -f /var/log/messages | nc -l 31334
$ nc 172.16.69.143 31334
3 Использовать вместо telnet (первая - telnet-сервер, вторая - клиент):
$ nc -l -p 31334 -e /bin/sh
$ nc 172.16.69.143 31334
4 Сканировать на открытые порты:
$ nc -z execbit.ru 1-1024
5 Осуществлять фингерпринт сервисов на основе баннеров:
$ echo "QUIT" | nc execbit.ru 1-1024
6 Организовывать обратный шелл (первая - клиент, вторая - сервер, однако шелл откроется от сервера к клиенту):
$ nc -e /bin/sh 172.16.69.143 31334
$ nc -l -p 31334
7 Делать микрофонную запись с удаленной машины (сервер, клиент):
$ arecord -f dat -t raw | nc -l 31337
$ nc 172.16.69.143 31337 | oggenc - -r -o nc.ogg
8 Получать снимки с web-камеры удаленной машины (сервер, клиент):
$ while [ 1 ]; do streamer -o /tmp/photo.jpeg; nc -l 31337 < /tmp/photo.jpeg; done
$ nc localhost 31337 > photo.jpeg
Однако, важно понимать, что существует несколько версий netcat, поведение которых может отличаться. Экземпляр, поставляемый с дистрибутивами Linux, - это оригинал, доживший до наших дней. Все пять приведенных примеров он отработает без проблем. Версия под названием GNU Netcat не поддерживает опции -e, поэтому второй и пятый примеры она не воспримет.
Особого внимания заслуживает netcat, распространяемый вместе с BSD-системами, опция -e в нем есть, но предназначена она для шифрования входящего и исходящего трафика методом IPSec ESP:
$ nc -e 'in ipsec esp/transport//require' -e 'out ipsec esp/transport//require' \
172.16.69.143 31334
Кроме того, BSD Netcat способен подключаться к удаленной машине через прокси:
$ nc -x172.16.64.1:8080 -Xconnect 172.16.69.143 31334
В этом примере прокси находится по адресу 172.16.64.1:8080, а флаг -Xconnect говорит о том, что он работает с протоколом HTTP. Также поддерживаются SOCKS версий 4 и 5, но о них следует информировать netcat через флаг -X4 или -X5.
Сам netcat легко использовать в качестве прокси или редиректора портов, но в этом случае его лучше связать с демоном inetd:
# echo 'redirect-2525-to-25 2525/tcp' >> /etc/services
# echo 'redirect-2525-to-25 stream tcp nowait nobody /usr/bin/nc nc -w 2 127.0.0.1 25' \
>> /etc/inetd.conf
# killall -HUP inetd
Теперь весь трафик, пришедший на порт 2525, будет перенаправляться на стандартный 25-й SMTP-порт. Таким же образом мы можем завернуть трафик с любого порта на другой порт/машину, просто видоизменив первые две команды.
Кстати, пользователи дистрибутивов Linux могут вообще не заморачиваться с netcat: демон xinetd, ставший стандартом в Linux-системах, сам умеет перенаправлять сетевой трафик:
$ echo /etc/xinetd/redirect

service redirect-2525-to-25
{
  disable = no
  type = UNLISTED
  socket_type = stream
  protocol = tcp
  wait = no
  port = 2525
  redirect = 127.0.0.1 25
  user = nobody
}

четверг, 28 июня 2012 г.

Минт - (пере)маппирование клавиш клавиатуры

В чем проблема? Не работает Энетер который в нумпаде...

Текущие состояние дел покажет xev

KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19285204, (688,648), root:(691,696),
    state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19285309, (688,648), root:(691,696),
    state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305238, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d, KB_Enter), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305332, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d,
KB_Enter), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False




Запускаем команду...
xmodmap -e 'keycode 104=Return'

смотрим результат


KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305238, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d, Return), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305332, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d,
Return), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False


среда, 13 июня 2012 г.

Одной строкой

  • Переименуем все *.JPG в *.jpg: rename -vs/.JPG/.jpg/s *.JPG
  • Google mp3 search: -inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" +description +size +(wma|mp3) "bla bla"
  • Выбираем наиболее активные IP-адреса из логов: tail -n 400000 /path/to/log/access_log | cut -d" " -f1 | sort | uniq -c | sort -n | tail -n 30
  • Пример использования pstree: while :; do pstree | grep postmaster; sleep 3; done
  • netstat -nltp
  • cvs diff -u8pN ./filename
  • less для mysql: mysql --pager='less -niSFX -Kutf-8' --default-character-set=utf8
  • Вывод запроса в консоль без разделителей в MySQL: mysql -N -B -uName -pPassword -hHost -e "select * from TableTable" DBName
  • Поменять оболочку для пользователя по умолчанию в Sun Unix-ах можно командой usermod -s /usr/bin/bash myUserName
  • tcpdump -XXepnnvvvi bge0 host 192.168.5.15
  • Посмотреть, сколько на машине физической памяти можно командой sysctl -a | grep mem, сколько процессоров - cat /var/run/dmesg.boot | grep -i cpu
  • Подключить tsearch к PostgreSQL можно так: psql -h -d -U postgres < ltree.sql и psql -h -d -U postgres < tsearch2.sql, где ltree.sql и tsearch2.sql лежат в /usr/local/share/postgresql/contrib
  • Сделать текст в консоли в bash зеленым можно с помощью команды: export PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
Отсюда... http://www.gnuman.ru


вторник, 5 июня 2012 г.

Мониторинг изменений iptables на svn и redmine (debian)

        1.  Настройка сервера с SVN и Redmine

http://www.debuntu.org/2006/05/20/54-how-to-subversion-svn-with-apache2-and-dav


Neccessary packages:
First of all we need to install the required packages:
apt-get install subversion libapache2-svn
Repository structure:
The projects are going to be hosted on /var/svn/repository. We need to create to directories and give full permission to the apache user:
mkdir /var/svn
mkdir /var/svn/repository
Now that the directory exist, we need to give write access to the apache user:
chown www-data:www-data -R /var/svn/repository
chmod 770 -R /var/svn/repository
Configuring Apache:
Now, we need to modify apache svn module configuration file, edit /etc/apache2/mods-available/dav_svn.conf and make sure the following argument are properly setted up:
...
SVNParentPath /var/svn/repository
#SVNPath /var/svn/repository
.....
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
...
In order to be able to track who modify the different files of the project, we need to create users. Create the first user (tester) and supply a password:
htpasswd -c /etc/apache2/dav_svn.passwd client01_user
Creating a first repository:
Get apache user access (so files and directories are created with proper rights:
su www-data
and create your first repository (example):
svnadmin create /var/svn/repository/client01
Now, get back to root user (Ctrl-D) and restart apache:
/etc/init.d/apache2 restart
Your project is now avalaible to the different user you will add in /etc/apache2/dav_svn.passwd .
User tester can now access the project at http://svnhostaddress/example and checkout a first copy to his computer, modify files and commit back his changes to the server.

Установка redmine 

apt-get install redmine

      2.  Настройка клиента



Уcтановка необходимых пакетов

apt-get install subversion


Создадим папку репозитория
mkdir /var/svn

cd /var/svn

импортируем с сервера svn саму папку (не забыть точку в конце)
root@client01:/var/svn# svn co http://192.168.55.9/svn/client01 .


Далее пропатчим iptables.sh

root@client01:/etc/network# tail -n3 iptables.sh
iptables-save | egrep -v '^(#|:)' > /var/svn/iptables_svn
/usr/local/sbin/commit_svn $@



сам файлик /usr/local/sbin/commit_svn
root@client01:/etc/network# cat /usr/local/sbin/commit_svn
#!/bin/bash
comment=$@
if [ -z "$comment" ]; then
    comment="no comments"
fi

if [ $USER = "root" ]; then
    user=$SUDO_USER
else
    user=$USER
fi

if [ -n "$user" ]; then
    svn ci --username $user --config-dir /home/$user/.subversion/ -m"$comment" /var/svn/iptables_svn
fi



Выполним вручную iptables.sh,  чтобы создался файл  /var/svn/iptables_svn

Добавим новый файл в репозиторий

root@client01:/var/svn#svn add iptables_svn

Логин и пароль на доступ к svn  сохраняется в домашней директории /home/$user/.subversion/

      3.  Настройка redmine

 Создадим проект iptables. Далее подпроект client01
В настройках хранилища указываем параметры svn  сервера
http://192.168.55.9/svn/client01

Для  redmine на сервере svn можно создать отдельного ползователя  redmine
root@svn:/tmp#htpasswd /etc/apache2/dav_svn.passwd redmine



SVN auto Commit cron 

1 вариант 

отсюда... http://snippet.espend.de/ssh/svn-auto-commit-cron-54.html

#!/bin/bash
 
# CHANGES:
# Feb 2nd 2010: Fixing a nasty bug found bug Jason Judge that would make
#  the script fail once in a while;
 
#------------------------------- Subroutines ---------------------------------
usage(){
echo " Usage: $(basename $0) PATH" 
echo ""
echo "Automatically commits the changes of svn working copy located in PATH."
echo "The new files are automatically added and the files that have been removed"
echo "are removed."
echo ""
echo "By Gael Varoquaux"
}
 
#------------------------------- Process the options -------------------------
if [ $# -eq 1 ]
then
    workingdir="$1"
else
    usage
    exit 1
fi
 
if ! cd $workingdir
then
    echo $workingdir is not a accessible path.
    usage
    exit 1
fi
 
#------------------------------- Find out what has changed -------------------
 
# A warning if this fails :
echo "SVN autocommit failed or nothing todo" 
 
svnstatus=$(svn status $workingdir)
added=$(printf "%s" "$svnstatus" | sed -n 's/^[A?] *\(.*\)/\1/p')
removed=$(printf "%s" "$svnstatus" | sed -n 's/^! *\(.*\)/\1/p')
 
if [ "x$added" != "x" ]
then
    echo adding "$added" to repository
    svn add $added
fi
 
if [ "x$removed" != "x" ]
then
    echo removing "$removed" to repository
    svn remove $removed
fi
 
svn commit -m "autocommit" 
 
 
 
2 вариант 
 
 
#!/bin/bash
# Run commit every second.
# Why? Cron can't do that.
# This can be used combined with a post-commit hook to make a kind of a versioned FTP :P

# This script needs a initial checkout! A working copy must exist a priori!

# You need to set-up a "svn-path" file in the same directory as the script with one working copy a line
# /absolute/working-copy/
# /absolute/working-copy2/

# Bugs: 
# Sometimes when you work with someone else on the same file it can overwrite others modifications with yours without throwing a conflict
# Good thing it's svn and you can easily merge the modifications afterwards. Still this bug is annoying

# Change this to your paths
script_path="/home/sasha/Scripts/"
paths_file="/home/sasha/Scripts/svn-paths"

while [ true ]; do
 message="*Auto-message*"
 for local_path in `cat $paths_file| grep -v "#"`; do
  stat=`svn status $local_path`
  if [[ $stat != '' ]]; then #Are there any changes?
   delete_files=`echo $stat|grep -e "^\!"|cut -d" " -f2`
   if [[ $delete_files != '' ]]; then
    svn delete $delete_files>/dev/null 2>/dev/null
    svn commit --non-interactive -m "$message (delete)" $remote_url >/dev/null 2>>"$script_path"commit_log
   fi
   # Do we have any files to add
   add_files=`echo $stat|grep -e "^\?"|cut -d" " -f2`
   if [[ $add_files != '' ]]; then
    svn add $add_files >/dev/null 2>/dev/null # Add new files if there are any
    svn commit --non-interactive -m "$message (add)" $remote_url >/dev/null 2>>"$script_path"commit_log # Finaly commit
   fi
   svn update $local_path >/dev/null 2>>/dev/null #Checkout first
   svn commit --non-interactive -m "$message (modified)" $local_path >/dev/null 2>>"$script_path"commit_log # Finaly commit
  fi
 done
 sleep 1
done
 
 

воскресенье, 27 мая 2012 г.

Bash : converting unix timestamp to date

Under Debian or RHEL4 and later, it can be as simple as :

$ date -d @1193144433
Tue Oct 23 15:00:33 CEST 2007


But that command doesn’t work under Redhat EL 3, so you should use the following :

$ date --date "1970-01-01 1193144433 sec" "+%Y-%m-%d %T"
2007-10-23 15:00:33


The output is different though

You can always use the previous command under Ubuntu/RHEL4+ or the simpler :

$ date -d @1193144433 "+%Y-%m-%d %T"
2007-10-23 15:00:33


Converting a date to unix timestamp :

$ date -d "2007-10-23 15:00:23" "+%s"
1193144423


Add "--utc" to the commands if you want to get the UTC time.

вторник, 22 мая 2012 г.

Пингвин под колпаком: Аудит системных событий в Linux



Грамотная после-установочная настройка Linux-дистрибутива – лишь первый шаг на пути к безопасности и стабильности. Чтобы операционная система и дальше продолжала отвечать этим требованиям, придется приучить себя к постоянному слежению за ее состоянием. Этого можно достичь с помощью мониторинга и анализа лог-файлов, однако получение полного контроля над системой возможно только с помощью аудита системных событий.
Перед тем как перейти к основной части статьи, постараемся разобраться с тем, что же все-таки представляет собой системный аудит (или аудит системных событий). По самой своей сути это не что иное, как постоянное и подробное протоколирование любых событий, происходящих в операционной системе. Аудиту могут быть подвержены такие события, как чтение/запись файлов, выполнение входа в ОС, запуск и остановка приложений, инициация сетевого соединения и многое, многое другое. Linux, как и любая другая современная серверная ОС, включает в себя все необходимые инструменты для проведения аудита системы, однако разобраться в них с наскоку не так-то просто.

Система аудита ядра 2.6

Начиная с версии 2.6, ядро Linux включает в себя подсистему, специально разработанную для проведения аудита. Она позволяет вести слежение за такими системными событиями, как:
  • Запуск и завершение работы системы (перезагрузка, остановка);
  • Чтение/запись или изменение прав доступа к файлам;
  • Инициация сетевого соединения или изменение сетевых настроек;
  • Изменение информации о пользователе или группе;
  • Изменение даты и времени;
  • Запуск и остановка приложений;
  • Выполнение системных вызовов.
На деле этот список гораздо длиннее, но другие типы событий не представляют для нас практического интереса. Кроме самого факта возникновения события, система аудита представляет такую информацию, как дата и время возникновения события, отвественность пользователя за событие, тип события и его успешность. Сама по себе она способна лишь сообщать о произошедшем событии, тогда как процесс журналирования возлагается на плечи демона auditd.

Установка

Демон auditd доступен в любом современном Linux-дистрибутиве и может быть установлен с помощью стандартного менеджера пакетов. Например, чтобы установить auditd в Debian/Ubuntu, достаточно выполнить следующую команду:
$ sudo apt-get install auditd
Кроме самого демона, вместе с пакетом будут установлены три подсобные утилиты, используемые для управления системой аудита и поиска записей в журнальных файлах:
  • auditctl – утилита, управляющая поведением системы аудита. Позволяет узнать текущее состояние системы, добавить или удалить правила;
  • autrace – аудит событий, порождаемых указанным процессом (аналог strace);
  • ausearch – команда, позволяющая производить поиск событий в журнальных файлах;
  • aureport – утилита, генерирующая суммарные отчеты о работе системы аудита;
По умолчанию система аудита находится в спящем состоянии и не реагирует ни на какие события (ты можешь убедиться в этом, выполнив команду «sudo auditctl -l»). Чтобы заставить систему сообщать нам подробности каких-либо событий, необходимо добавить правила. Но чтобы понять, как их составлять, придется разобраться с тем, как работает подсистема аудита ядра Linux.

Аудит системных событий

Ни одно событие в любой операционной системе не может произойти без использования системных вызовов ядра. Запуск нового процесса, открытие файлов и работа с ними, запрос времени или типа ОС, обращение к оборудованию, создание сетевого соединения, вывод информации на экран – все эти операции производятся с помощью обращения к функциям ядра операционной системы, для краткости называемых системными вызовами. Если приложение не прибегает в своей работе к вызовам ядра, оно оказывается замкнутым в самом себе и просто не способно к какому-либо взаимодействию со своим окружением, не говоря уже о пользователе. Следовательно, чтобы отследить любое системное событие, достаточно просто перехватывать все обращения к системным вызовам.
Именно это делает подсистема аудита. Она устанавливает триггеры до и после всех функций, ответственных за обработку системных вызовов, и ждет. Когда происходит системный вызов, триггер срабатывает, подсистема аудита получает всю информацию о вызове и его контексте, передает ее демону auditd и отдает дальнейшее управление функции, обрабатывающей системный вызов. После ее завершения срабатывает «выходной» триггер, и вся информация о системном вызове вновь поступает к подсистеме аудита и демону auditd.
Естественно, держать все эти триггеры в активном состоянии все время работы ОС накладно и слишком избыточно (только во время старта приложение может выполнить несколько тысяч системных вызовов и для полного анализа журнала аудита придется убить уйму времени). Поэтому по умолчанию триггеры отключены и могут быть выборочно активированы с помощью правил, которые задают имя системного вызова, его успешность, пользователя, от имени которого произошел вызов и т.д.
Благодаря такой нехитрой схеме, системный администратор может вести наблюдение за любым аспектом работы операционной системы (кроме, конечно же, тех событий, которые вызваны компонентами самого ядра). Поэтому, если в системе происходят какие-либо подозрительные действия, вызванные работой взломщика или вредоносного ПО, с помощью системного аудита не составит труда их выявить и найти виновного.

Правила аудита

Для создания, удаления и модификации правил аудита предназначена утилита auditctl. Есть три основных опции, которые принимает эта команда:
  • -a – добавить правило в список;
  • -d – удалить правило из списка;
  • -D – удалить все правила;
  • -l – вывести список заданных правил.
Если ты сейчас выполнишь команду «auditctl -l» от имени администратора, то, скорее всего, увидишь «No rules», а это значит, что ни одного правила аудита еще не существует. Для добавления правил используется следующая форма записи команды auditctl:
# auditctl -a список,действие -S имя_системного_вызова -F фильтры
Здесь список – это список событий, в который следует добавить правило. Всего существует пять списков:
  • task – события, связанные с созданием процессов;
  • entry – события, происходящие при входе в системный вызов;
  • exit – события, происходящие во время выхода из системного вызова;
  • user – события, использующие параметры пользовательского пространства, такие как uid, pid и gid;
  • exclude – используется для исключения событий.
Не беспокойся, если смысл списков кажется тебе непонятным. По сути, это всего лишь фильтры, которые позволяют сделать правила более точными. На деле из них используются только entry и exit, которые позволяют зарегистрировать либо сам факт обращения к системному вызову, либо его успешную отработку.
Второй параметр опции – '-a' – это действие, которое должно произойти в ответ на возникшее событие. Их всего два: never и always. В первом случае события не записываются в журнал событий, во втором – записываются.
Далее указывается опция '-S', которая задает имя системного вызова, при обращении к которому должен срабатывать триггер (например, open, close, exit, и т.д.). Вместо имени может быть использовано числовое значение.
Необязательная опция '-F' используется для указания дополнительных параметров фильтрации события. Например, если мы хотим вести журнал событий, связанных с использованием системного вызова open(), но при этом желаем регистрировать только обращения к файлам каталога /etc, то должны использовать следующее правило:
# auditctl -a exit,always -S open -F path=/etc/
Чтобы еще более сузить круг поисков, сделаем так, чтобы регистрировались только те события, при которых файл открывается только на запись и изменение атрибутов:
# auditctl -a exit,always -S open -F path=/etc/ -F perm=aw
Здесь 'a' – изменение атрибута (то есть attribute change), а 'w' – запись (то есть write). Также можно использовать 'r' – чтение (read) и 'x' – исполнение (execute). Другие полезные фильтры включают в себя: pid – события, порождаемые указанным процессом, apid – события, порождаемые указанным пользователем, success – проверка на то, был ли системный вызов успешным, a1, a2, a3, a4 – первые четыре аргумента системного вызова. Фильтр key используется для указания так называемого ключа поиска, который может быть использован для поиска всех событий, связанных с этим ключом. Количество возможных фильтров достаточно велико, их полный список можно найти в man-странице auditctl.
Вообще, для слежения за файлами в auditctl предусмотрен специальный синтаксис, при котором опцию '-S' можно опустить. Например, описанное выше правило может быть задано следующим образом (здесь опция '-p' – это эквивалент фильтра perm):
# auditctl -a exit,always -F dir=/etc/ -F perm=wa
Или используя более короткую форму (здесь оцпия '-p' – это эквивалент фильтра perm, а '-k' – фильтра key):
# auditctl -w /etc/ -p wa -k access_etc
Таким же образом может быть установлена «слежка» за любым индивидуальным файлом:
# auditctl -w /etc/passwd -p wa

Конфигурационные файлы

Правила не обязательно задавать, используя командную строку. Во время старта демон auditd читает два файла: /etc/audit/auditd.conf и /etc/audit/audit.rules (в некоторых дистрибутивах они могут находиться прямо в /etc). Первый описывает конфигурацию демона и содержит такие опции, как имя журнала, его формат, частота обновления и другие параметры. Нет смысла их изменять, разработчики дистрибутива уже позаботились о грамотной настройке.
Второй файл содержит правила аудита в формате auditctl, поэтому все, что нужно сделать, чтобы получить правило, пригодное для записи в этот файл – просто опустить имя команды. Например:
-w /etc/passwd -p wa
В начале файла обычно размещаются несколько мета-правил, задающих конфигурацию и очищающих правила:
# Удаляем все правила из всех списков
-D

# Указываем количество буферов, хранящих сообщения аудита
-b 8192

# Что делать в чрезвычайной ситуации (например, если все буферы будут заполнены)
# 0 – ничего не делать
# 1 – поместить сообщение в dmesg
# 2 – отправить ядро в панику (kernel panic)
-f 1

Далее можно разместить свои правила.

Примеры правил

Первое, что следует сделать – настроить наблюдение за всеми конфигурационными и лог-файлами системы аудита. Если взломщик сможет компрометировать один из них, он наверняка изменит поведение демона, и мы просто не сможем найти его следы.
# vi /etc/audit/audit.rules
# Наблюдение за конфигурационными файлами
-w /etc/audit/auditd.conf -p wa
-w /etc/audit/audit.rules -p wa
-w /etc/libaudit.conf -p wa
-w /etc/default/auditd -p wa

# Наблюдение за журнальными файлами
-w /var/log/audit/
-w /var/log/audit/audit.log

Далее установим наблюдение за наиболее важными системными конфигурационными файлами. Изменение хотя бы одного из них может привести к открытию дыры в безопасности системы, чего допустить нельзя. Обрати внимание, что некоторые файлы актуальны только для дистрибутивов Debian/Ubuntu!
# vi /etc/audit/audit.rules
# Настройки и задания at
-w /var/spool/at
-w /etc/at.allow
-w /etc/at.deny

# Задания cron
-w /etc/cron.allow -p wa
-w /etc/cron.deny -p wa
-w /etc/cron.d/ -p wa
-w /etc
/cron.daily/ -p wa
-w /etc/cron.hourly/ -p wa
-w /etc/cron
.monthly/ -p wa
-w /etc/cron
.weekly/ -p wa
-w /etc/crontab
-p wa
-w /var/spool/cron/root

# Файлы паролей и групп
-w /etc/group -p wa
-w /etc/passwd -p wa
-w /etc/shadow

# Конфигурационные и журнальные файлы входа в систему
-w /etc/login.defs -p wa
-w /etc/securetty
-w /var/log/faillog
-w /var/log/lastlog

# Список и имена хостов
-w /etc/hosts -p wa

# Стартовые скрипты демонов
-w /etc/init.d/
-w /etc/init.d/auditd -p wa

# Пути поиска библиотек
-w /etc/ld.so.conf.d
-w /etc/ld.so.conf -p wa

# Настройки времени
-w /etc/localtime -p wa

# Системные переменные
-w /etc/sysctl.conf -p wa

# Правила загрузки модулей
-w /etc/modprobe.d/

# Модули системы PAM
-w /etc/pam.d/

# Настройки сервера SSH
-w /etc/ssh/sshd_config

Настроим наблюдение за всеми системными вызовами, которые могут угрожать безопасности системы. Эти правила следует применять только в случае особой необходимости, они создадут высокую нагрузку на систему аудита и приведут к существенному разрастанию журнальных файлов, однако взамен ты получишь тотальный контроль над системой и сможешь легко выявить малейшее нарушение ее работы.
# vi /etc/audit/audit.rules
# Изменение прав доступа к файлам
-a entry,always -S chmod -S fchmod -S chown -S chown32 -S fchown -S fchown32 -S lchown -S lchown32

# Создание, открытие или изменение размеров файлов
-a entry,always -S creat -S open -S truncate -S truncate64 -S ftruncate -S ftruncate64

# Создание и удаление каталогов
-a entry,always -S mkdir -S rmdir

# Удаление или создание ссылок
-a entry,always -S unlink -S rename -S link -S symlink

# Изменение расширенных атрибутов файлов
-a entry,always -S setxattr
-a entry,always -S lsetxattr
-a entry,always -S fsetxattr
-a entry,always -S removexattr
-a entry,always -S lremovexattr
-a entry,always -S fremovexattr

# Создание файлов устройств
-a entry,always -S mknod

# Монтирование файловых систем
-a entry,always -S mount -S umount -S umount2

# Использование системного вызова ptrace для отладки процессов
-a entry,always -S ptrace

Анализ журнальных файлов

Журнальные файлы, создаваемые демоном auditd в каталоге /var/log/audit, не предназначены для чтения человеком, но хорошо подходят для анализа с помощью специальных утилит, устанавливаемых вместе с самим демоном. Самая важная из них – утилита aureport, генерирующая отчеты из лог-файлов. Вызвав ее без аргументов, мы узнаем общую статистику использования системы, включая такие параметры, как количество входов и выходов из системы, открытых терминалов, системных вызовов и т.д. Эта информация малоинтересна, поэтому лучше запросить более детальный отчет. Например, запустив команду с флагом '-f', мы получим список файлов, к которым происходил доступ:
$ sudo aureport -f
Скорее всего вывод будет слишком длинным, но его можно сократить с помощью запроса информации только за определенный период времени (аргумент '--end' не обязателен):
$ sudo aureport -f --start 08/20/10 12:00 --end 08/20/10 13:00
Кроме числового значения времени можно использовать следующие специальные сокращения: now (сейчас), recent (десять минут назад), today (начиная с полуночи), yesterday (вчерашние сутки), this-week (неделя), this-month (месяц) или this-year (год). Вывод команды разбит на несколько столбцов, которые имеют следующие значения (слева направо):
  1. Просто числовой индекс;
  2. Дата возникновения события;
  3. Время возникновения события;
  4. Имя файла;
  5. Номер системного вызова (чтобы увидеть его имя, используй флаг '-i');
  6. Успешность системного вызова (yes или no);
  7. Имя процесса, вызвавшего событие;
  8. Audit UID (AUID). О нем читай ниже;
  9. Номер события.
Вывод этой команды также можно существенно сократить, если указать флаг '--summary', который заставляет aureport выводить не все случаи доступа к файлом, а только их общее количество по отношению к каждому из файлов:
$ sudo aureport -f -i --start recent --summary
Вывод команды будет разбит на две колонки, первая из которых отражает количество попыток доступа к файлу (успешных или нет), а вторая – его имя. Просматривая суммарный отчет использования файлов и заметив подозрительную попытку доступа к одному из системных/скрытых/личных файлов, можно вновь вызвать aureport, чтобы найти процесс, который произвел эту попытку:
$ sudo aureport -f -i --start today | grep /etc/passwd
Получив список всех попыток доступа и номера событий, каждое из них можно проанализировать индивидуально с помощью утилиты ausearch:
$ sudo auserch -a номер_события
Также ausearch можно использовать для поиска событий по именам системных вызовов:
$ sudo ausearch -sc ptrace -i
Идентификаторам пользователей:
$ sudo ausearch -ui 2010
Именам исполняемых файлов:
$ sudo ausearch -x /usr/bin/nmap
Имени терминала:
$ sudo ausearch -tm pts/0
Именам демонов:
$ sudo ausearch -tm cron
Или ключам поиска:
$ sudo auserch -k etc_access
Вывод ausearch также может быть сокращен с помощью использования временных промежутков, наподобие тех, что мы использовали при вызове aureport. Сам aureport позволяет генерировать отчеты не только по использованию файлов, но и многих других типов событий, как, например, системные вызовы (флаг '-s'), попытки аутентификации (флаг '-au') , успешные логины (флаг '-l'), модификации аккаунта (флаг '-m') и многих других (полный список смотри в man-странице). Отчеты можно получать только для событий, завершившихся неудачно (флаг '--failed').

AUID и PAM

Во время своей работы в системе пользователь может использовать команды su или sudo для изменения своего системного идентификатора (UID), из-за чего процесс отслеживания его деятельности существенно усложняется. Чтобы обойти эту проблему система аудита использует так называемые Audit UID (AUID), которые закрепляются за каждым пользователем во время его входа в систему и остаются неизменными даже несмотря на смену пользователем своего UID с помощью su или sudo. Однако, по умолчанию функция присваивания AUID отключена (именно поэтому восьмой столбец вывода aureport всегда содержит значение -1), и, чтобы ее активировать, необходимо отредактировать некоторые конфигурационные файлы PAM. Для этого открой файл /etc/pam.d/login и добавь строку «session required pam_loginuid.so» перед строкой «session include common-session». Таким же образом измени конфигурационные файлы /etc/pam.d/sshd, /etc/pam.d/gdm (kdm, если ты используешь среду KDE), /etc/pam.d/crond и /etc/pam.d/atd.

Выводы

Система аудита – достаточно низкоуровневый компонент Linux, который требует глубоких знаний ОС для своей настройки и анализа журнальных файлов. Однако, разобравшись в нем, ты получишь мощнейший инструмент слежения за системой, который поможет обнаружить аномалии в поведении системы и найти их виновника.

WARNING

Чтобы изменения, внесенные тобой в конфигурационные файлы демона auditd, вступили в силу, необходимо перезагрузить демон с помощью команды «/etc/init.d/auditd restart».

INFO

На нашем диске ты найдешь пример рабочего файла правил auditd, который сможешь использовать на своем сервере под управлением Debian/Ubuntu.

WWW

Steve Grubb из компании Red Hat написал два небольших скрипта для визуализации отчетов системы аудита: