суббота, 27 февраля 2010 г.

secure linux procfs permissions

Есть два способа обезопасить /proc

Первый самый простой и быстрый
chmod 550 /proc
И непривилегированный пользователь не увидит ничего, даже своих процессов.

Второй, пропатчить ядро чтобы пользователь мог видеть только свои процессы.

cd /usr/src/linux/fs/proc
vi base.c
и в функции proc_pid_instantiate меняем

inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
на
inode->i_mode = S_IFDIR|S_IRUSR |S_IXUSR;

Ну и до кучи запретим who и last

chmod 660 /var/run/utmp
chmod 660 /var/log/wtmp

На centos тоже самое поправить в /etc/rc.sysinit и в /etc/logrotate.conf
чтобы при загрузке права не слетали и в /etc/logrotate.conf

в debian /etc/init.d/bootmisc.sh

среда, 24 февраля 2010 г.

как быстро отучить mysql от socket'a и научить работать с localhost по tcp

Как правило нужно это для выноса mysql на отдельный сервер сохраняя при этом localhost в настройках соединения к базам.

Как известно mysql если видит что обращение идет к localhost'у то соединяется с сервером через локальный socket . И никакие настройки отучить его от этого не могут, т.к. это прошито в коде.

Отучить его от этого можно 2-мя способами.

1. Пересобрать mysql заменив
в файле include/mysql_com.h
#define LOCAL_HOST "localhost"

на что-нибудь типа
#define LOCAL_HOST "l0calhost"

После этого mysql не будет воспринимать localhost как нечто особенное, и будет работать с ним по tcp как с обычным хостом.

2. Второй способ - это бинарный патч клиентских библиотек.
Это очень быстро и безболезненно.

Ставим hexedit
hexedit /usr/lib64/mysql/libmysqlclient.so.15.0.0
жмем tab
ищем строку localhost
меняем одну букву и получаем например l0calhost
сохраняем и выходим Ctrl-X

Тоже самое делаем с /usr/lib64/mysql/libmysqlclient_r.so.15.0.0
Меняем IP в /etc/hosts для localhost на наш новый mysql сервер.
Все, теперь можем работать с удаленной базой как с локальной, даже авторизация не побьется, т.к. сервер на удаленной стороне будет авторизовать вас как localhost :)

пятница, 19 февраля 2010 г.

включаем show user_statistics patch на centos5 для mysql-5.0.77

wget http://mirror.corbina.net/pub/Linux/centos/5.4/os/SRPMS/mysql-5.0.77-3.el5.src.rpm
rpm -i mysql-5.0.77-3.el5.src.rpm

wget http://www.percona.com/percona-builds/Percona-SQL-5.0/Percona-SQL-5.0-5.0.87-b20/source/Percona-SQL-50-5.0.87-b20.6.rhel5.src.rpm

rpm -i Percona-SQL-50-5.0.87-b20.6.rhel5.src.rpm
cd /home/rpmbuild/rpm/SOURCES/
cd percona_mysql.5.0.77-b16/
mv * ../

cd /home/rpmbuild/rpm/SPECS/
vi mysql.spec

меняем все что касается патчей на
Patch1: show_patches.patch
Patch2: microslow_innodb.patch
Patch3: profiling_slow.patch
Patch4: userstatv2.patch
Patch5: microsec_process.patch
Patch6: innodb_io_patches.patch
Patch7: mysqld_safe_syslog.patch
Patch8: innodb_locks_held.patch
Patch9: innodb_show_bp.patch
Patch10: innodb_check_fragmentation.patch
Patch11: innodb_io_pattern.patch
Patch12: innodb_fsync_source.patch
Patch13: innodb_show_hashed_memory.patch
Patch14: innodb_dict_size_limit.patch
Patch15: innodb_extra_rseg.patch
Patch16: innodb_thread_concurrency_timer_based.patch
Patch18: innodb_misc_patch.patch
Patch120: innodb_rw_lock.patch
Patch21: mysql-test.patch

и
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch18 -p1
%patch120 -p1
%patch21 -p1

в %configure отключаем ssl
--without-openssl

и комментим make test
# make test

собираем
rpmbuild -bb mysql.spec

и инсталлируем
rpm --force -iv /home/rpmbuild/rpm/RPMS/x86_64/mysql-5.0.77-3.x86_64.rpm
rpm --force -iv /home/rpmbuild/rpm/RPMS/x86_64/mysql-server-5.0.77-3.x86_64.rpm

vi /etc/my.cnf

в [mysqld] добавляем

userstat_running=1


/etc/init.d/mysqld restart
mysql -u root -p

show user_statistics\G
User: root
Total_connections: 1
Concurrent_connections: 0
Connected_time: 707
Busy_time: 0
Cpu_time: 0
Bytes_received: 75
Bytes_sent: 4734
Binlog_bytes_written: 0
Rows_fetched: 0
Rows_updated: 0
Table_rows_read: 0
Select_commands: 0
Update_commands: 0
Other_commands: 3
Commit_transactions: 0
Rollback_transactions: 0
Denied_connections: 0
Lost_connections: 0
Access_denied: 0
Empty_queries: 0

работает

четверг, 18 февраля 2010 г.

установка ядра 2.6.32 на centos 5

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.bz2
tar -xjf linux-2.6.32.7.tar.bz2
cd linux-2.6.32.7
yum -y install gcc
yum -y install ncurses-dev

make menuconfig
обязательно отмечаем
General setup ---> enable deprecated sysfs features which may confuse old userspace
иначе ядро при загрузке выдаст
mount: could not find filesystem '/dev/root'
Kernel panic ...

make all
make modules_install
make install
reboot

включаем pam_limits в suexec под debian

apt-get install lsb-release
apt-get install debhelper
apt-get install libaprutil1-dev
apt-get install sharutils

apt-get source apache2-suexec

cd apache2-2.2.9/
wget http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=27;filename=suexec-203_suexec-pam.dpatch;att=1;bug=268569 -o suexec-203_suexec-pam.dpatch

patch -p1 < suexec-203_suexec-pam.dpatch

vi support/suexec.c

добавляем в начало
#define SUEXEC_PAM_SESSION 1

vi support/Makefile.in
и меняем
$(LINK) $(suexec_OBJECTS)
на
$(LINK) -lpam $(suexec_OBJECTS)
и
$(LINK) $(suexec-custom_OBJECTS)
на
$(LINK) -lpam $(suexec-custom_OBJECTS)

fakeroot debian/rules binary

cd ../
dpkg -i apache2-suexec_2.2.9-10+lenny6_amd64.deb

vi /etc/pam.d/suexec

вписываем
@include common-session
session required pam_limits.so

правим права в
/etc/security/limits.conf

/etc/init.d/apache2 restart

Теперь все cgi и fcgi процессы лимитируются через limits.conf

вторник, 16 февраля 2010 г.

заменить строку в файле с помощью perl

perl -p -i -e "s/Listen.*/Listen 8081/g" /etc/httpd2/ports.conf

воскресенье, 7 февраля 2010 г.

включаем show user_statictics в mysql под debian

apt-get source mysql-server
wget --no-check-certificate https://www.byte.nl/downloads/mysql/5.0.45-debian/99_mysql-dfsg-5.0_5.0.45-3~bpo40+1byte4.dpatch

cd mysql-dfsg-5.0-5.0.51a/
patch -p1 < 99_mysql-dfsg-5.0_5.0.45-3~bpo40+1byte4.dpatch

vi mysql-test/mysql-test-run
Вставляем exit 0; чтобы пропустить все тесты (очень долгое занятие)
#!/usr/bin/perl
# -*- cperl -*-
exit 0;


fakeroot debian/rules binary
cd ..
dpkg -i mysql-server-5.0_5.0.51a-24+lenny2+spu1_amd64.deb

mysql -u root -p

mysql> show user_statistics \G
*************************** 1. row ***************************
User: root
Total_connections: 1
Concurrent_connections: 1
Connected_time: 1158
Busy_time: 1
Rows_fetched: 4
Rows_updated: 2
Select_commands: 4
Update_commands: 8
Other_commands: 27
*************************** 2. row ***************************
User: debian-sys-maint
Total_connections: 30
Concurrent_connections: 0
Connected_time: 0
Busy_time: 13
Rows_fetched: 284
Rows_updated: 0
Select_commands: 53
Update_commands: 0
Other_commands: 2
2 rows in set (0.00 sec)

mysql>

пятница, 5 февраля 2010 г.

linux 2.6.32 & CONFIG_USER_SCHED=y

собираем linux 2.6.32 с CONFIG_USER_SCHED=y
и получаем

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8981 test1 20 0 4016 752 356 R 50 0.0 0:32.35 gzip
8982 test1 20 0 4016 756 356 R 50 0.0 0:32.23 gzip
8983 test1 20 0 4016 752 356 R 50 0.0 0:31.86 gzip
8984 test1 20 0 4016 756 356 R 50 0.0 0:31.35 gzip
8992 test2 20 0 4016 756 356 R 17 0.0 0:12.07 gzip
8987 test2 20 0 4016 756 356 R 17 0.0 0:13.72 gzip
8988 test2 20 0 4016 756 356 R 17 0.0 0:13.54 gzip
8993 test2 20 0 4016 756 356 R 17 0.0 0:11.98 gzip
8994 test2 20 0 4016 756 356 R 17 0.0 0:11.95 gzip
9010 test2 20 0 4016 756 356 R 17 0.0 0:04.18 gzip
9012 test2 20 0 4016 756 356 R 17 0.0 0:04.07 gzip
9013 test2 20 0 4016 756 356 R 17 0.0 0:04.07 gzip
9015 test2 20 0 4016 756 356 R 17 0.0 0:04.00 gzip
8985 test2 20 0 4016 756 356 R 16 0.0 0:14.04 gzip
8986 test2 20 0 4016 756 356 R 16 0.0 0:13.80 gzip
8991 test2 20 0 4016 760 356 R 16 0.0 0:12.17 gzip

смотрим на распределение %cpu
юзер test1 получает 50% (в системе 4 ядра) при наличии всего 4 процессов
в то время как юзер test2 получает все те же 50% размазанные на все его процессы.
Абсолютно справедливо, как и было заявлено.
Идеально для шаред хостинга.

nginx & apache .htaccess

Включаем контроль доступа по ip в схеме nginx frontend и apache backend

В .htaccess пишем

SetEnvIf Remote_Addr "^10\.11\.12\.13" realremoteaddr
Order Deny,Allow
Deny from all
allow from env=realremoteaddr

где 10.11.12.13 - это разрешенный ip

четверг, 4 февраля 2010 г.

меняем timezone в debian


dpkg-reconfigure tzdata

посмотреть конфиг сборки пакета в debian

apt-get source exim4-daemon-heavy
cd exim4-4.69
fakeroot debian/rules unpack-configs
vi EDITME.exim4-heavy