Виртуальный полигон для разработчика и администратора на основе Linux и VMWare Андрей Бешков # rpm -i VMware-workstation-4.0.0-4460.i386.rpm # rpm -qa | grep VMware VMwareWorkstation-4.0.0-4460 # tar zxvf VMware-workstation-4.0.0-4460.tar.gz # cd vmware-distrib # ./vmware-install.pl # which make which: no make in (/root/bin:/sbin:/usr/sbin:/usr/local/ sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin) # rpm -qa | grep make # cd /mnt/cdrom/auto/ALTLinux/RPMS # rpm -i make-3.79.1-ipl6mdk.i586.rpm # rpm -qa | grep gcc libgcc3.2-3.2.1-alt2 gcc-common-1.2.1-alt2 #ll /etc/alternatives/gcc lrwxrwxrwx 1 root rpm 20 Aug 29 00:39 /etc/alternatives gcc -> /usr/bin/gcc_wrapper # ./gcc_wrapper i586-alt-linux-gcc: No such file or directory # rpm -i gcc2.96-2.96-alt3.i586.rpm error: failed dependencies: cpp2.96 = 2.96-alt3 is needed by gcc2.96-2.96-alt3 binutils >= 1:2.13.90.0.4-alt2 is needed by gcc2.96-2.96-alt3 glibc-devel is needed by gcc2.96-2.96-alt3 # rpm -i cpp2.96-2.96-alt3.i586.rpm # rpm -i kernel-headers-common-1.0-alt2.noarch.rpm # rpm -i kernel24-headers-2.4.20-alt5.i586.rpm # rpm -i glibc-devel-2.2.6-alt0.6.i586.rpm # rpm -i libbfd-2.13.90.0.4-alt2.i586.rpm # rpm -i binutils-2.13.90.0.4-alt2.i586.rpm # rpm -i gcc2.96-2.96-alt3.i586.rpm # rpm -qpl kernel24-headers-2.4.20-alt5.i586.rpm # rpm -qa | grep samba samba-client-2.2.7-alt3 samba-2.2.7-alt3 samba-client-cups-2.2.7-alt3 samba-common-2.2.7-alt3 # ps -ax | grep -v grep | grep mbd 1260 ? S 0:00 /usr/bin/vmware-nmbd -D -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf -f /var/run/vmware-nmbd-vmnet1.pid 1280 ? S 0:00 /usr/bin/vmware-smbd -D -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf -f /var/run/vmware-smbd-vmnet1.pid # service vmware status At least one instance of VMware Workstation is still running. vmnet-bridge (pid 1165) is running... vmnet-dhcpd (pids 1373 1287 1273 1239) are running... vmnet-netifup (pids 1308 1251 1208 1182) are running... Module vmmon installed Module vmnet installed # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:92 (92.0 b) TX bytes:92 (92.0 b) vmnet1 Link encap:Ethernet HWaddr 00:50:56:C0:00:01 inet addr:192.168.40.1 Bcast:192.168.40.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:65 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) vmnet2 Link encap:Ethernet HWaddr 00:50:56:C0:00:02 inet addr:192.168.80.1 Bcast:192.168.80.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) vmnet3 Link encap:Ethernet HWaddr 00:50:56:C0:00:03 inet addr:192.168.120.1 Bcast:192.168.120.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) vmnet8 Link encap:Ethernet HWaddr 00:50:56:C0:00:08 inet addr:172.16.252.1 Bcast:172.16.252.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) # ps -ax | grep -v grep | grep vm 7398 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet1/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet1/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet1.pid vmnet1 7411 ? S 0:00 /usr/bin/vmware-nmbd -D -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf -f /var/run/vmware-nmbd-vmnet1.pid 7431 ? S 0:00 /usr/bin/vmware-smbd -D -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf -f /var/run/vmware-smbd-vmnet1.pid 7434 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet2/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet2/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet2.pid vmnet2 7493 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet8/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet8/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8 7516 ? S 0:00 /usr/bin/vmnet-natd -d /var/run/vmnet-natd-8.pid -m /var/run/vmnet-natd-8.mac -c /etc/vmware/vmnet8/nat/nat.conf 7543 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet3/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet3/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet3.pid vmnet3 subnet 192.168.80.0 netmask 255.255.255.0 { range 192.168.80.128 192.168.80.254; option broadcast-address 192.168.80.255; option domain-name-servers 192.168.80.1; option domain-name "localdomain"; option routers 192.168.80.2; } # incoming www from outside on port 80 80 = 192.168.40.32:80 # service vmware restart Stopping VMware services: Virtual machine monitor [ OK ] Bridged networking on /dev/vmnet0 [ OK ] DHCP server on /dev/vmnet1 [ OK ] SMB share server on /dev/vmnet1 [ OK ] SMB name server on /dev/vmnet1 [ OK ] Host-only networking on /dev/vmnet1 [ OK ] DHCP server on /dev/vmnet2 [ OK ] Host-only networking on /dev/vmnet2 [ OK ] DHCP server on /dev/vmnet3 [ OK ] Host-only networking on /dev/vmnet3 [ OK ] DHCP server on /dev/vmnet8 [ OK ] NAT networking on /dev/vmnet8 [ OK ] Host-only networking on /dev/vmnet8 [ OK ] Virtual ethernet [ OK ] Starting VMware services: Virtual machine monitor [ OK ] Virtual ethernet [ OK ] Bridged networking on /dev/vmnet0 [ OK ] Host-only networking on /dev/vmnet1 (background) [ OK ] Host-only networking on /dev/vmnet2 (background) [ OK ] Host-only networking on /dev/vmnet3 (background) [ OK ] Host-only networking on /dev/vmnet8 (background) [ OK ] NAT networking on /dev/vmnet8 # ps -ax | grep -v grep | grep vm 4515 pts/1 S 0:00 /usr/bin/vmnet-bridge -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0 4531 pts/1 S 0:00 /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet1.pid /dev/vmnet1 vmnet1 4555 pts/1 S 0:00 /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet2.pid /dev/vmnet2 vmnet2 4586 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet2/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet2/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet2.pid vmnet2 4595 pts/1 S 0:00 /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet3.pid /dev/vmnet3 vmnet3 4645 pts/1 S 0:00 /usr/bin/vmnet-netifup -d /var/run/vmnet-netifup-vmnet8.pid /dev/vmnet8 vmnet8 4675 ? S 0:00 /usr/bin/vmnet-natd -d /var/run/vmnet-natd-8.pid -m /var/run/vmnet-natd-8.mac -c /etc/vmware/vmnet8/nat/nat.conf 4686 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet8/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet8/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8 $ /usr/bin/vmware lnc0: flags=8843 mtu 1500 inet 192.168.40.2 netmask 0xffffff00 broadcast 192.168.40.255 inet6 fe80::20c:29ff:fec7:b430%lnc0 prefixlen 64 scopeid 0x1 ether 00:0c:29:c7:b4:30 lnc1: flags=8843 mtu 1500 inet 192.168.80.2 netmask 0xffffff00 broadcast 192.168.80.255 inet6 fe80::20c:29ff:fec7:b43a%lnc1 prefixlen 64 scopeid 0x2 ether 00:0c:29:c7:b4:3a lnc2: flags=8843 mtu 1500 inet 192.168.120.2 netmask 0xffffff00 broadcast 192.168.120.255 inet6 fe80::20c:29ff:fec7:b444%lnc2 prefixlen 64 scopeid 0x3 ether 00:0c:29:c7:b4:44 lp0: flags=8810 mtu 1500 faith0: flags=8002 mtu 1500 lo0: flags=8049 mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6 inet 127.0.0.1 netmask 0xff000000 ppp0: flags=8010 mtu 1500 sl0: flags=c010 mtu 552 Файловые системы Linux Сергей Яремчук #make xconfig #mount -o data=journal -t ext3 /dev/hda5 /usr/local /dev/hda5 /usr/local ext3 data=writeback 1 0 /dev/hda5 /usr/local ext3 defaults 1 0 /dev/hda5 /usr/local ext2 defaults 1 0 # /sbin/tune2fs -j /dev/hdа5 # /sbin/mke2fs -j /dev/hdb5 # /sbin/mkreiserfs /dev/hda2 /dev/hda4 /home reiserfs defaults 0 0 #/sbin/mount -t /reiserfs dev/hda4 /home /dev/hda4 /home reiserfs notail 0 0 #/sbin/mkfs.xfs /dev/hdb2 или mkfs -t xfs /dev/hdb2 #/sbin/mkfs.xfs -d agcount=5 -l size=32m -f /dev/hdb2 # dd if=/dev/zero of=/dev/hdb2 # mount -t xfs =/dev/hdb2 /home /dev/hdb2 /home xfs defaults 0 0 /dev/hdb2 /home xfs noatime, nodiratime, osyncisdsync, logbufs=4 0 0 # mkfs.jfs /dev/hdb3 # mount -t jfs /dev/hdb3 /jfs # mkfs.jfs -j /dev/hdb1 /dev/hda6 # mount -t jfs /dev/hda6 /jfs /dev/hda6 /jfs jfs defaults 1 2 Архитектура файловой системы ext2 Владимир Мешков /* * Special inode numbers */ #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_IN 2 /* Root inode */ #define EXT2_ACL_IDX_IN 3 /* ACL inode */ #define EXT2_ACL_DATA_INO 4 /* ACL inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ group = (inode_num - 1) / inodes_per_group index = (inode_num - 1) % inodes_per_groupe #include #include #include #include #include #include /* * Constants relative to the data blocks */ #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1) #define EXT2_NAME_LEN 255 #define PART_NAME "/dev/hda3" struct ext2_super_block sb; /* буфер для хранения таблицы дескрипторов групп */ unsigned char buff_grp[4096]; unsigned char buff[4096]; /* информационный буфер */ int indev; /* дескриптор файла устройства */ int BLKSIZE; /* размер блока файловой системы */ void read_sb() { memset(&sb,0,1024); if(lseek(indev,1024,0) < 0) { perror("lseek"); exit(-1); } if(read(indev,(char *)&sb,sizeof(sb)) < 0) { perror("read"); exit(-1); } if(sb.s_magic != EXT2_SUPER_MAGIC) { printf("Неизвестный тип файловой системы!\n"); exit(-1); } printf("\nSuperblock info\n-----------\n"); printf("Inodes count\t\t-\t%u\n",sb.s_inodes_count); printf("Blocks count\t\t-\t%u\n",sb.s_blocks_count); printf("Block size\t\t-\t%u\n",1024 << sb.s_log_block_size); printf("First inode\t\t-\t%d\n",sb.s_first_ino); printf("Magic\t\t\t-\t0x%X\n",sb.s_magic); printf("Inode size\t\t-\t%d\n",sb.s_inode_size); printf("Inodes per group\t-\t%u\n",sb.s_inodes_per_group); printf("Blosks per group\t-\t%u\n",sb.s_blocks_per_group); printf("First data block\t-\t%u\n\n",sb.s_first_data_block); return; } void read_gdt() { BLKSIZE = 1024 << sb.s_log_block_size if(lseek(indev, (sb.s_first_data_block + 1) * BLKSIZE, 0) < 0) { perror("lseek"); exit(-1); } if(read(indev,buff_grp,BLKSIZE) < 0) { perror("read"); exit(-1); } return; } void get_inode(int inode_num, struct ext2_inode *in) { struct ext2_group_desc gd; __u64 group, index, pos; group = (inode_num - 1) / sb.s_inodes_per_group; memset((void *)&gd, 0, sizeof(gd)); memcpy((void *)&gd, buff_grp + (group * (sizeof(gd))), sizeof(gd)); index = (inode_num - 1) % sb.s_inodes_per_group; pos = ((__u64)gd.bg_inode_table) * BLKSIZE + (index * sb.s_inode_size); pread64(indev, in, sb.s_inode_size, pos); return; } void read_iblock(struct ext2_inode *in, int blk_num) { __u64 pos; pos = ((__u64)in->i_block[blk_num]) * BLKSIZE; pread64(indev, buff, BLKSIZE, pos); return; } void get_root_dentry() { struct ext2_inode in; get_inode(EXT2_ROOT_INO, &in); read_iblock(&in, 0); return; } int get_i_num(char *name) { int i = 0, rec_len = 0; struct ext2_dir_entry_2 dent; for(; i < 700; i++) { memcpy((void *)&dent, (buff + rec_len), sizeof(dent)); if(!memcmp(dent.name, name, dent.name_len)) break; rec_len += dent.rec_len; } return dent.inode; } int main() { struct ext2_inode in; // абсолютное путевое имя файла unsigned char *full_path = "/home/test.file"; unsigned char buff1[EXT2_NAME_LEN]; static int i = 1; int n, i_num, outf, type; if(full_path[0] != '/') { perror("slash"); exit(-1); } indev = open(PART_NAME,O_RDONLY); if(indev < 0) { perror("open"); exit(-1); } read_sb(); read_gdt(); get_root_dentry(); while(1) { memset(buff1,0,sizeof(buff1)); for(n = 0 ; n < EXT2_NAME_LEN; n++, i++) { buff1[n] = full_path[i]; if((buff1[n] == '/') || (buff1[n] == '\0')) { i++; break; } } buff1[n] = '\0'; i_num = get_i_num(buff1); get_inode(i_num, &in); read_iblock(&in, 0); printf("Inode number - %u\n", i_num); printf("File name - %s\n", buff1); printf("File size - %u\n",in.i_size); type = ((in.i_mode & 0xF000) >> 12); printf("Type - %d ",type); switch(type) { case(0x04) : printf("(каталог)\n\n"); break; case(0x08) : printf("(обычный файл)\n\n"); break; case(0x06) : printf("(файл блочного устройства)\n\n"); break; case(0x02) : printf("(файл символьного устройства)\n\n"); break; default: printf("(unknown type)\n"); break; } if(type & 0x08) { outf = open("out",O_CREAT|O_RDWR,0600); write(outf, buff, sizeof(buff)); close(outf); break; } } close(indev); return 0; } bugtraq стр.33 login:crypt_passwd: char *skey_challenge(char *name, struct passwd *pwd, int pwok) $ { $ static char buf[128]; ... if (pwd == NULL || skeychallenge(&skey, pwd->pw_name, sbuf)) $ sprintf(buf, "Password required for %s.", name); else sprintf(buf, "%s %s for %s.", sbuf, pwok ? "allowed" : "required", name); return (buf); } % diff -u ftpd.c fixed-ftpd.c --- ftpd.c 2001-11-29 17:56:11.000000000 +0100 +++ fixed-ftpd.c 2003-10-20 20:43:58.000000000 +0200 @@ -1662,9 +1662,9 @@ /* Display s/key challenge where appropriate. */ if (pwd == NULL || skeychallenge(&skey, pwd->pw_name, sbuf)) - sprintf(buf, "Password required for %s.", name); + snprintf(buf, 128-1, "Password required for %s.", name); else - sprintf(buf, "%s %s for %s.", sbuf, + snprintf(buf, 128-1, "%s %s for %s.", sbuf, pwok ? "allowed" : "required", name); return (buf); } % Интеграция SQUID + LDAP Марк Кричмар tar zxvf SQUID-2.5.STABLE2.tar.gz ./configure --enable-delay-pools --enable-cache-err-language=Russian-1251 --enable-linux-netfilter --enable-external-acl-helper=ldap_group --enable-basic-auth-helpers=LDAP make all make install cp helpers/basic_auth/LDAP/squid_ldap_auth /usr/local/squid/libexec cp helpers/external_acl/ldap_group/squid_ldap_group /usr/local/squid/libexec cd /usr/local/squid/sbin ./squid –z auth_param basic program /usr/local/squid/libexec/squid_ldap_auth –P –b dc=mydomain,dc=ru –f (&(uid=%s)(description=active)) –h 127.0.0.1 external_acl_type ldap_group %LOGIN /usr/local/squid/libexec/squid_ldap_group –P –b dc=mydomain,dc=ru –f (&(uid=%v)(member=ou=%a,dc=mydomain,dc=ru)) –h 127.0.0.1 –p 389 acl users proxy_auth dima petya vasya authenticate_program /usr/local/squid/bin/ncsa_auth /usr/local/squid/etc/passwd acl users external ldap_group accounts acl admin external ldap_group admin acl icq_only external ldap_group icq http_access allow admin # include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema include /usr/local/etc/openldap/schema/nis.schema #Эта схема для поддержки qmail include /usr/local/etc/openldap/schema/qmail.schema pidfile /usr/local/var/slapd.pid argsfile /usr/local/var/slapd.args #В поле userPassword лежит пароль пользователя. Его может #прочитать и изменить только сам пользователь, ну и себя #любимого не забыл. access to attr=userPassword by self write by anonymous auth by dn="cn=Manager,dc=mydomain,dc=ru" write by * none #Если в этом поле active – Интернет есть, иначе – нет access to attr=description by self read by anonymous read by dn="cn=Manager,dc= mydomain,dc=ru" write by * none #На одной строчке access to attr=title,ou,telephoneNumber,cn,sn,givenName,o,initials,physicalDeliveryOfficeName,destinationIndicator by self write by anonymous read by users read by dn="cn=Manager,dc= mydomain,dc=ru" write access to * by self read by anonymous read by users read by dn="cn=Manager,dc= mydomain,dc=ru" write database ldbm suffix "dc= mydomain,dc=ru" rootdn "cn=Manager,dc= mydomain,dc=ru" rootpw secret directory /usr/local/var/openldap-ldbm index objectClass,mail,cn,sn,uid eq #Корень нашего дерева директорий dn: dc=mydomain,dc=ru objectClass: top #Группа админов dn: ou=admin,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: admin #Группа для пользователей icq dn: ou=icq,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: icq #Группа для простых пользователей dn: ou=accounts,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: accounts #Добавляем 1 пользователя в группу admin dn: uid=boss,ou=admin,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson #Это для Qmail objectClass: qmailUser #Обязательный класс, чтобы появилось поле member objectClass: groupOfNames #Если active то все пучком:) description: active #Сюда я забиваю время создания данной записи, на всякий случай destinationIndicator: 01.02.03 #Здесь я указываю лимит в байтах, который установлен #для данного пользователя preferredLanguage: 50000000 #Это поле только для Qmail accountStatus: active #Именно по этому полю проверяется принадлежность #пользователя к группе member: ou=admin,dc=mydomain,dc=ru sn:: 0J/Rg9GC0LjQvQ== cn:: 0J/Rg9GC0LjQvSDQktC70LDQtNC40LzQuNGAINCS0LvQsNC00LjQvNC40YDQvtCy0LjRhw== userPassword: 123 telephoneNumber: 111-11-11 title:: 0J/RgNC10LfQuNC00LXQvdGC ou:: 0JzQvtGB0LrQstCwINC60YDQtdC80LvRjA== givenName:: 0JLQu9Cw0LTQuNC80LjRgA== initials:: 0JLQu9Cw0LTQuNC80LjRgNC+0LLQuNGH mail: boss@mydomain.ru uid: boss #Это поле только для Qmail mailMessageStore: /var/qmail/maildirs/boss #Это поле только для Qmail mailHost: mailhost.boss.ru #Добавляем 1 пользователя в группу icq dn: uid=icq_user,ou=icq,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: groupOfNames description: active member: ou=icq,dc=mydomain,dc=ru sn: Sidoriv cn: Sidorov Fedor Petrovich userPassword: 321 telephoneNumber: 999-99-99 title: Doctor ou: Departament givenName: Fedor initials: Petrovich mail: icq_user@mydomain.ru uid: icq_user #Добавляем 1 пользователя в группу accounts dn: uid=Ivan,ou=accounts,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: groupOfNames description: active member: ou=icq,dc=mydomain,dc=ru sn: Ivanov cn: Ivanov Ivan Ivanovich userPassword: 333 telephoneNumber: 999-99-99 title: Doctor ou: Departament givenName: Ivan initials: Ivanovich mail: Ivan@mydomain.ru uid: Ivan /path/ldapadd –x –D “cn=Manager,dc=mydomain,dc=ru” –W –f /path/example.ldif Использование бездисковых маршрутизаторов Андрей Мозговой /usr/sbin/in.tftpd -l -v -s /tftpboot/ /tftpboot/pxelinux.cfg/C0A80002 default /kernels/test/bzImage initrd=/images/initrd.br load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=16384 rw root=/dev/ram0 console=ttyS0 prompt 1 display /images/default.txt F1 /images/help.txt timeout 50 label linux kernel /kernels/bare.i/bzImage append - label bare.i kernel /kernels/bare.i/bzImage append initrd=/images/initrd.br load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=8192 rw root=/dev/ram SLACK_KERNEL=bare.i Аудит учетных записей пользователей в Active Directory Максим Костышин csvde -f USERS_WORK.CSV -b GUEST MICROSOFT * -r "(&(objectClass=user)(!(objectClass=computer)) (!(userAccountControl=514))(!(userAccountControl=66050)))" -l "DN, memberOf, badPasswordTime, lastLogon, logonCount, sAMAccountName, userAccountControl, whenChanged, whenCreated" 126858492000000000 – соответствует 1.01.2003 00:00 127014876000000000 – соответствует 1.07.2003 00:00 127014912000000000 – соответствует 1.07.2003 01:00 =ПСТР(A2; НАЙТИ("CN=";A2)+3; НАЙТИ(","; A2; НАЙТИ( "CN="; A2 )+3 ) - НАЙТИ("CN=";A2) -3 ) =ЕСЛИ(ЕПУСТО('0'!A2);""; ЕСЛИ(ЕОШИБКА(НАЙТИ("OU=";'0'!A2)); "USERS"; ПСТР( '0'!A2; НАЙТИ("OU=";'0'!A2)+3; НАЙТИ(","; '0'!A2; НАЙТИ("OU=";'0'!A2)+3) – НАЙТИ("OU=";'0'!A2) -3 ) ) ) = ЕСЛИ( ЗНАЧЕН(ЛЕВСИМВ(F2;11))=0; -1; ОКРУГЛВНИЗ((ЗНАЧЕН(ЛЕВСИМВ(F2;11))- 12685849200)/24/3600; 0) ) =ЕСЛИ( E2=-1; "Отсутствует"; СЦЕПИТЬ( ДЕНЬ(ДАТАЗНАЧ("1/1/2003")+E2); "."; МЕСЯЦ(ДАТАЗНАЧ("1/1/2003")+E2); "."; ГОД(ДАТАЗНАЧ("1/1/2003")+E2) ) =СЦЕПИТЬ( ПСТР(N2;7;2); "."; ПСТР(N2;5;2); "."; ПСТР(N2;1;4); " "; ПСТР(N2;9;2); ":"; ПСТР(N2;11;2) ) =ЕСЛИ(ЕПУСТО(G2);""; ЕСЛИ(ИЛИG2=514; G2=66050);"Заблокированная";"Действующая") ) Удобнее, эффективнее, лучше: snort + MySQL Павел Закляков # wget http://www.snort.org/dl/snort-2.0.2.tar.gz # wget http://www.snort.org/dl/snort-2.0.2.tar.gz.md5 # cat snort-2.0.2.tar.gz.md5 # md5sum snort-2.0.2.tar.gz # wget http://www.snort.org/dl/rules/snortrules-stable.tar.gz # wget http://www.snort.org/dl/rules/snortrules-stable.tar.gz.md5 # cat snortrules-stable.tar.gz.md5 # md5sum snortrules-stable.tar.gz #./configure --with-mysql # rpm -ihv libpcap-0.6.2-12.i386.rpm # chkconfig mysqld on # /etc/rc.d/init.d/mysqld start # ./configure --with-mysql # make # make install var HOME_NET 123.45.45.45 var HOME_NET [10.1.1.0/24,192.168.1.0/24] var RULE_PATH rules # database: log to a variety of databases # --------------------------------------- # See the README.database file for more information about # configuring and using this plugin. # # output database: log, mysql, user=root password=test dbname=db host=localhost # output database: alert, postgresql, user=snort dbname=snort # output database: log, unixodbc, user=snort dbname=snort # output database: log, mssql, dbname=snort user=snort password=test output database: log, mysql, user=snort password=ваш_пароль№1 dbname=snort host=localhost # mysql -u root mysql> set password for 'root'@'localhost'=password('ваш_пароль№2'); Query OK, 0 rows affected (0.39 sec) mysql> create database snort; mysql> exit # mysql -u root -p # mysql -D snort -u root -p < /progi/snort-2.0.2/contrib/create_mysql # mysql -u root -p mysql> connect snort mysql> source create_mysql Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.00 sec) mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort; mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snort.* to snort@localhost; mysql> grant CREATE,INSERT,SELECT,UPDATE on snort.* to acidviewer; mysql> grant CREATE,INSERT,SELECT,UPDATE on snort.* to acidviewer@localhost; mysql> connect mysql mysql> set password for 'snort'@'localhost'=password('ваш_пароль№1'); mysql> set password for 'snort'@'%'=password('ваш_пароль№1'); mysql> set password for 'acidviewer'@'localhost'=password('ваш_пароль№3'); mysql> set password for 'acidviewer'@'%'=password('ваш_пароль№3'); mysql> flush privileges; mysql> exit # /usr/local/bin/snort -o -i eth0 -d -c /etc/snort/snort.conf ERROR: database: mysql_error: Access denied for user: 'snort@localhost' (Using password: YES) #!/bin/bash # # snortd Start/Stop the snort IDS daemon. # # chkconfig: 2345 79 11 # description: snort is a lightweight network intrusion # detection tool that currently detects more than 1100 host # and network vulnerabilities, portscans, backdoors, and more. # # June 10, 2000 -- Dave Wreski # - initial version # # July 08, 2000 Dave Wreski # - added snort user/group # - support for 1.6.2 # Source function library. . /etc/rc.d/init.d/functions # Specify your network interface here INTERFACE=eth0 # See how we were called. case "$1" in start) echo -n "Starting snort: " # ifconfig eth0 up daemon /usr/local/bin/snort -o -i $INTERFACE -d -D -c /etc/snort/snort.conf touch /var/lock/subsys/snort sleep 3 if [ -f /var/log/snort/alert ] then rm /var/log/snort/alert fi echo ;; stop) echo -n "Stopping snort: " killproc snort rm -f /var/lock/subsys/snort echo ;; restart) $0 stop $0 start ;; status) status snort ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0 # ln -s /etc/rc.d/init.d/snortd /etc/rc.d/rc3.d/S79snortd # ln -s /etc/rc.d/init.d/snortd /etc/rc.d/rc3.d/K11snortd # chkconfig snortd on # chkconfig --level 3 snortd on # tail -f имя_этого_файла # cat имя_log_файла # mysql -u snort -p mysql> SHOW DATABASES; mysql> CONNECT snort; mysql> SHOW TABLES; mysql> SHOW COLUMNS FROM event; mysql> DESCRIBE event; mysql> SELECT * FROM event WHERE cid<10; mysql> SELECT * FROM event; mysql> SELECT * FROM signature WHERE sig_id=2; mysql> SELECT sig_id,sig_name FROM signature WHERE sig_id=2; mysql> SELECT event.cid,signature.sig_name,event.timestamp FROM event,signature WHERE event.signature=signature.sig_id AND cid<10; # md5sum phpMyAdmin-2.5.4-php.tar.gz (MD5: 76fc7216aa2f132888c7173a6668af46) $cfg['Servers'][$i]['password'] = ''; $cfg['Servers'][$i]['password'] = 'ваш_пароль№2'; mysql> SELECT event.cid,signature.sig_name,event.timestamp FROM event,signature WHERE event.signature=signature.sig_id AND cid<10; d8c49614393fa05ac140de349f57e438 acid-0.9.6b23.tar.gz 78aac17c7fd1d0e0f6685153facb8c36 adodb394.tgz 6ededf633b4fd054662ec123c7825fbb gd-2.0.15.tar.gz ad78bd1658e3983bb6afbc074f029698 jpgraph-1.13.tar.gz 8a5b34e09fa29f20e31814cbd8c0d0b5 phplot-4.4.6.tar.gz # tar -zxvf acid-0.9.6b23.tar.gz -C /var/www/html # tar -zxvf adodb394.tgz -C /var/www/html # tar -zxvf gd-2.0.15.tar.gz -C /var/www/html # tar -zxvf phplot-4.4.6.tar.gz -C /var/www/html # tar -zxvf jpgraph-1.13.tar.gz -C /var/www/html # mkdir /var/www/html/jpgraph # mv /var/www/html/jpgraph-1.13/src/* /var/www/html/jpgraph # rm -rf /var/www/html/jpgraph-1.13 # cd /var/www/html # mv gd-2.0.15 gd # mv phplot-4.4.6 phplot # cd /var/www/html # ln -s gd-2.0.15 gd # ln -s phplot-4.4.6 phplot $DBlib_path = "../adodb"; $alert_dbname = "snort"; $alert_user = "snort"; $alert_password = "ваш_пароль№1"; $ChartLib_path = "../jpgraph"; # cp -R /var/www/html/acid /var/www/html/acidviewer $alert_user = "snort"; $alert_password = "ваш_пароль№1"; $alert_user = "acidviewer"; $alert_password = "ваш_пароль№3"; # mkdir /usr/lib/apache/passwords # htpasswd -c /usr/lib/apache/passwords/passwords admin # htpasswd /usr/lib/apache/passwords/passwords view AuthType Basic AuthName "commentline1" AuthUserFile /usr/lib/apache/passwords/passwords Require user admin AllowOverride None AuthType Basic AuthName "commentline2" AuthUserFile /usr/lib/apache/passwords/passwords Require user view AllowOverride None # /etc/rc.d/init.d/httpd restart Fusebox в помощь веб-программисту Андрей Уваров Дмитрий Горяинов switch($Fusebox["fuseaction"]) { case "mainpage": case "Fusebox.defaultFuseaction": include( "out_simple.php" ); break; default: //остальное содержимое оставим без изменений

Sample application

"bar.menu", "stoplayout"=>"true" ) ); ?>
//In case no fuseaction was given, I'll set up one to use //by default if( !isset( $attributes[ "fuseaction" ] ) ) { $attributes["fuseaction"] = "home.mainpage"; } $Fusebox["circuits"]["home"] = "fuse_sample"; $Fusebox["circuits"]["bar"] = "fuse_sample/bar"; В файл fbx_Layouts.php пропишем: if ( $attributes["stoplayout"] ) { $Fusebox["layoutFile"] = ""; $Fusebox["layoutDir"] = ""; } else { $Fusebox["layoutFile"] = "out_main.php"; $Fusebox["layoutDir"] = ""; } switch($Fusebox["fuseaction"]) { case "mainpage": case "Fusebox.defaultFuseaction": echo "Bar's main page"; break; case "menu": $XFA[ "main" ] = "home.mainpage"; $XFA[ "bar1" ] = $Fusebox[ "thisCircuit" ] . ".bar1"; $XFA[ "bar2" ] = $Fusebox[ "thisCircuit" ] . ".bar2"; $XFA[ "bar3" ] = $Fusebox[ "thisCircuit" ] . ".bar3"; include( "out_barmenu.php" ); break; case "bar1": echo "this is content of bar1"; break; case "bar2": echo "this is content of bar2"; break; case "bar3": echo "this is content of bar3"; break; default: //остальное содержимое оставим без изменений $Fusebox["layoutFile"] = ""; $Fusebox["layoutDir"] = ""; '; echo ' Main | '; echo ' Bar 1 | '; echo ' Bar 2 | '; echo ' Bar 3'; echo ''; ?> RewriteEngine on Options +FollowSymlinks DirectoryIndex index.php RewriteBase /fuse_sample/ RewriteCond %{REQUEST_FILENAME} !(index.php) RewriteRule ^(.*)$ index.php [QSA,R] Коды Рида-Соломона в практических реализациях, или информация, воскресшая из пепла III Крис Касперски Листинг 1. Исходный текст простейшего кодера Рида-Соломона /*-------------------------------------------------------- * * кодировщик Рида-Соломона * ======================== * * кодируемые данные передаются через массив data[i], * где i=0..(k-1), а сгенерированные символы четности * заносятся в массив b[0]..b[2*t-1]. * Исходные и результирующие данные должны быть представлены * в полиномиальной форме (т.е. в обычной форме машинного * представления данных). * Кодирование производится с использованием сдвигового * feedback-регистра, заполненного соответствующими элементами * массива g[] с порожденным полиномом внутри, процедура * генерации которого уже обсуждалась в предыдущей статье. * Сгенерированное кодовое слово описывается следующей * формулой: * с(x) = data(x)*x(n-k) + b(x) * * на основе исходных текстов * Simon Rockliff, от 26.06.1991, * распространяемых по лицензии GNU –––––––––––––––––––––––––––––––––––––––––––––––––––––––––*/ encode_rs() { int i, j; int feedback; // инициализируем поле бит четности нулями for (i = 0; i < n - k; i++) b[i] = 0; // обрабатываем все символы // исходных данных справа налево for (i = k - 1; i >= 0; i--) { // готовим (data[i] + b[n – k –1]) к умножению // на g[i], т.е. складываем очередной «захваченный» // символ исходных данных с младшим символом битов // четности (соответствующего «регистру» b2t-1, // см. рис. 2) и переводим его в индексную форму, // сохраняя результат в регистре feedback, как мы // уже говорили, сумма двух индексов есть // произведение полиномов feedback = index_of[data[i] ^ b[n – k - 1]]; // есть еще символы для обработки? if (feedback != -1) { // осуществляем сдвиг цепи bx-регистров for (j=n-k-1; j>0; j--) // если текущий коэффициент g – // это действительный (т.е. ненулевой // коэффициент, то умножаем feedback // на соответствующий g-коэффициент // и складываем его со следующим // элементом цепочки if (g[j]!=-1) b[j]=b[j-1]^alpha_to[(g[j]+feedback)%n]; else // если текущий коэффициент g – // это нулевой коэффициент, // выполняем один лишь сдвиг // без умножения, перемещая символ // из одного m-регистра в другой b[j] = b[j-1]; // закольцовываем выходящий символ в крайний // левый b0-регистр b[0] = alpha_to[(g[0]+feedback)%n]; } else { // деление завершено, // осуществляем последний сдвиг регистра, // на выходе регистра будет частное, которое // теряется, а в самом регистре – искомый // остаток for (j = n-k-1; j>0; j--) b[j] = b[j-1] ; b[0] = 0; } } } Листинг 2. Исходный текст простейшего декодера Рида-Соломона /*-------------------------------------------------------- * * декодер Рида-Соломона * ===================== * * Процедура декодирования кодов Рида-Соломона состоит * из нескольких шагов: сначала мы вычисляем 2t-символьный * синдром путем постановки alpha**i в recd(x), где recd – * полученное кодовое слово, предварительно переведенное * в индексную форму. По факту вычисления recd(x) мы записываем * очередной символ синдрома в s[i], где i принимает значение * от 1 до 2t, оставляя s[0] равным нулю. Затем, используя * итеративный алгоритм Берлекэмпа, мы находим полином локатора * ошибки – elp[i]. Если степень elp превышает собой величину * t, мы бессильны скорректировать все ошибки и ограничиваемся * выводом сообщения о неустранимой ошибке, после чего * совершаем аварийный выход из декодера. Если же степень elp * не превышает t, мы подставляем alpha**i, где i = 1..n в elp * для вычисления корней полинома. Обращение найденных * корней дает нам позиции искаженных символов. * Если количество определенных позиций искаженных символов * меньше степени elp, искажению подверглось более чем t * символов и мы не можем восстановить их. Во всех остальных * случаях восстановление оригинального содержимого искаженных * символов вполне возможно. В случае, когда количество ошибок * заведомо велико, для их исправления декодируемые символы * проходят сквозь декодер без каких-либо изменений. * * на основе исходных текстов * Simon Rockliff, от 26.06.1991, * распространяемых по лицензии GNU –––––––––––––––––––––––––––––––––––––––––––––––––––––––––*/ decode_rs() { int i, j, u, q; int s[n-k+1]; // полином синдрома ошибки int elp[n – k + 2][n - k]; // полином локатора ошибки // лямбда int d[n-k+2]; int l[n-k+2]; int u_lu[n-k+2], int count=0, syn_error=0, root[t], loc[t], z[t+1], err[n], reg[t+1]; // переводим полученное кодовое слово в индексную форму // для упрощения вычислений for (i = 0; i < n; i++) recd[i] = index_of[recd[i]]; // вычисляем синдром //----------------------------------------------------- for (i = 1; i <= n - k; i++) { s[i] = 0; // инициализация s-регистра // (на его вход по умолчанию // поступает ноль) // выполняем s[i] += recd[j]*ij // т.е. берем очередной символ декодируемых данных, // умножаем его на порядковый номер данного // символа, умноженный на номер очередного оборота // и складываем полученный результат с содержимым // s-регистра по факту исчерпания всех декодируемых // символ, мы повторяем весь цикл вычислений опять – // по одному разу для каждого символа четности for (j=0; j0)) q--; // найден первый ненулевой d[q] if (q > 0) { j=q ; do { j-- ; if ((d[j]!=-1) && (u_lu[q]0); }; // как только мы найдем q, такой что d[u]!=0 // и u_lu[q] есть максимум // запишем степень нового elp полинома if (l[u] > l[q]+u-q) l[u+1] = l[u]; else l[u+1] = l[q]+u-q; // формируем новый elp(x) for (i = 0; i < n - k; i++) elp[u+1][i] = 0; for (i = 0; i <= l[q]; i++) if (elp[q][i]!=-1) elp[u+1][i+u-q]=alpha_to [(d[u]+n-d[q]+elp[q][i])%n]; for (i=0; i<=l[u]; i++) { elp[u+1][i] ^= elp[u][i]; // преобразуем старый elp // в индексную форму elp[u][i] = index_of[elp[u][i]]; } } u_lu[u+1] = u-l[u+1]; // формируем (u + 1) невязку //---------------------------------------------- if (u < n-k) // на последней итерации расхождение { // не было обнаружено if (s[u + 1]!=-1) d[u+1] = alpha_to[s[u+1]]; else d[u + 1] = 0; for (i = 1; i <= l[u + 1]; i++) if ((s[u + 1 - i] != -1) && (elp[u + 1][i]!=0)) d[u+1] ^= alpha_to[(s[u+1-i]+index_of[elp[u+1][i]])%n]; // переводим d[u+1] в индексную форму d[u+1] = index_of[d[u+1]]; } } while ((u < n-k) && (l[u+1]<=t)); // расчет локатора завершен //----------------------------------------------------- u++ ; if (l[u] <= t) { // коррекция ошибок возможна // переводим elp в индексную форму for (i = 0; i <= l[u]; i++) elp[u][i] = index_of[elp[u][i]]; // нахождение корней полинома локатора ошибки //---------------------------------------------- for (i = 1; i <= l[u]; i++) reg[i] = elp[u][i]; count = 0; for (i = 1; i <= n; i++) { q = 1 ; for (j = 1; j <= l[u]; j++) if (reg[j] != -1) { reg[j] = (reg[j]+j)%n; q ^= alpha_to[reg[j]]; } if (!q) { // записываем корень и индекс // позиции ошибки root[count] = i; loc[count] = n-i; count++; } } if (count == l[u]) { // нет корней – степень // elp < t ошибок // формируем полином z(x) for (i = 1; i <= l[u]; i++) // Z[0] всегда // равно 1 { if ((s[i]!=-1) && (elp[u][i]!=-1)) z[i] = alpha_to[s[i]] ^ alpha_to[elp[u][i]]; else if ((s[i]!=-1) && (elp[u][i]==-1)) z[i] = alpha_to[s[i]]; else if ((s[i]==-1) && (elp[u][i]!=-1)) z[i] = alpha_to[elp[u][i]]; else z[i] = 0 ; for (j=1; j= t { // переводим recd[] в полиномиальную форму for (i=0; i t, // решение невозможно { // переводим recd[] в полиномиальную форму for (i=0; i #include "ElByECC.h" // декомпилировано автором // рушить по умолчанию #define _DEF_DMG 6 // сколько байт рушить? #define N_BYTES_DAMAGE ((argc>1)?atol(argv[1]):_DEF_DMG) main(int argc, char **argv) { int a; // заголовок сектора char stub_head[HEADER_SIZE]; // область пользовательских данных char user_data[USER_DATA_SIZE]; // сектор для искажений struct RAW_SECTOR_MODE1 raw_sector_for_damage; // контрольная копия сектора struct RAW_SECTOR_MODE1 raw_sector_for_compre; // TITLE //----------------------------------------------------- printf("= ElByECC.DLL usage demo example by KK\n"); // инициализация пользовательских данных //----------------------------------------------------- printf("user data initialize..............."); // user_data init for (a = 0; a < USER_DATA_SIZE; a++) user_data[a] = a; // src header init memset(stub_head, 0, HEADER_SIZE); stub_head[3] = 1; printf("+OK\n"); // генерация кодов Рида-Соломона на основе // пользовательских данных //----------------------------------------------------- printf("RS-code generate..................."); a = GenECCAndEDC_Mode1(user_data, stub_head, &raw_sector_for_damage); if (a == ElBy_SECTOR_ERROR) { printf("-ERROR!\x7\n"); return -1;} memcpy(&raw_sector_for_compre, &raw_sector_for_damage, RAW_SECTOR_SIZE); printf("+OK\n"); // умышленное искажение пользовательских данных //----------------------------------------------------- printf("user-data %04d bytes damage........", N_BYTES_DAMAGE); for (a=0;a