LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 737|回复: 2

在SELINUX环境中使用chroot运行bind9

[复制链接]
发表于 2007-4-13 11:36:25 | 显示全部楼层 |阅读模式
www.isc.org下载最新的bind。
解压,运行:
./configure --prefix=/var/named --sysconfdir=/etc --sbindir=/usr/sbin --enable-threads --enable-static --enable-ipv6=no --with-openssl=yse --disable-openssl-version-check

如果不使用--disable-openssl-version-check会提示你安装的openssl不够新(因为大部分的发
行版所带的openssl都不是最新的),而且有安全问题。因此你应该先安装新的openssl版本,采用直接
覆盖的方法安装openssl,因为如果你使用包管理工具卸载会因为依赖问题而无法成功,所以安装后要使用
此选项而不进行版本检测。

把bind安装到/var目录是因为要使用chroot环境运行named来增加安全性,而由于很多日志和部分数据
经常变动,因此不方便安装到/usr目录。
尽管named(8)的手册页(http://www.chedong.com/phpMan.php/man/named/8,FC系统中自带的
named手册页中可没这段话)这么说:

       It  is  not  necessary  to run named in a chroot environment if the
Red Hat SELinux policy for named is enabled. When enabled, this policy is
far more  secure  than  a chroot environment.

下面不指明根目录是默认采用bind安装目录/var/bind为基本路径。所有操作均在其子目录中进行。
生成rndc.conf:
在sbin目录中使用命令:./rndc-confgen > ../etc/rndc.conf
生成named.conf:
etc目录中使用命令:
tail -10 rndc.conf | head -9 | sed s/#\ //g > named.conf

在/var/bind目录中, 新建立更改context为下面类型:
[root@localhost bind]# ls -Z
drwxr-xr-x  root root system_ubject_r:bin_t          bin
drwxr-xr-x  root root system_ubject_r:etc_t          etc
drwxr-xr-x  root root system_ubject_r:var_t          include
drwxr-xr-x  root root system_ubject_r:usr_t          lib
drwxr-xr-x  root root system_ubject_r:sbin_t         sbin
drwxr-xr-x  root root system_ubject_r:var_t          var

子目录sbin下文件更改为下面的类型:
使用递归方式更改整个sbin子目录,然后单个更改named和named-checkconf的context.
 楼主| 发表于 2007-4-13 11:38:00 | 显示全部楼层
[root@localhost sbin]# ls -Z
-rwxr-xr-x  root root system_ubject_r:sbin_t         dnssec-keygen
-rwxr-xr-x  root root system_ubject_r:sbin_t         dnssec-signzone
-rwxr-xr-x  root root system_ubject_r:sbin_t         lwresd
-rwxr-xr-x  root root system_ubject_r:named_exec_t   named
-rwxr-xr-x  root root system_ubject_r:named_checkconf_exec_t named-checkconf
-rwxr-xr-x  root root system_ubject_r:sbin_t         named-checkzone
lrwxrwxrwx  root root system_ubject_r:var_t          named-compilezone -> named-checkzone
-rwxr-xr-x  root root system_ubject_r:sbin_t         rndc
-rwxr-xr-x  root root system_ubject_r:sbin_t         rndc-confgen

将etc目录下的named.conf的context更改为:
[root@localhost etc]# ls -Z
-rw-r--r--  root root system_ubject_r:named_conf_t   named.conf
-rw-r--r--  root root system_u:object_r:etc_t          rndc.conf

在var目录中建立log named run 3个子目录,并更改context为:
[root@localhost var]# ls -Z
drwxr-xr-x  root root  system_u:object_r:var_log_t      log
drwxr-x---  root named system_u:object_r:named_zone_t   named
drwxr-xr-x  root root  system_u:object_r:var_run_t      run

由于var/named目录更改为named_zone_t。根据手册页中的注释,在Red hat发行版中,
selinux是不允许除root外的用户更改主域的区域文件,这样,动态DNS更新和区域传送会
失败,因此,在该目录中建立了两个子目录,slave, data,用于此目的,并且使这两个目录
的context为named_cache_t, 如果文件内容需要更新,那么文件应该放入对应的两个目录
中,详细的情况请参考named(8)手册页。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-13 11:39:39 | 显示全部楼层
因此,在named子目录中建立slace, date 目录:
[root@localhost named]# ll
总计 48
drwxrwx--- 2 root  root  4096 02-26 21:07 data
-rwxrwx--- 1 root  root     0 03-21 20:50 lknc.org.rzone
-rwxrwx--- 1 root  root     0 03-21 20:50 lknc.org.zone
-rwxrwx--- 1 root  root   215 04-11 14:14 localhost.zone
-rwxrwx--- 1 root  root  2517 03-21 20:50 named.ca
-rwxrwx--- 1 root  root   269 03-21 20:50 named.local
drwxrwx--- 2 root  root  4096 02-26 21:07 slaves

(注:其他文件为我们安装后配置各种类型DNS服务器所需的文件)

在var子目录-run子目录中建立named目录,更改context为:
[root@localhost run]# ls -Z
drwxrwx---  named named system_ubject_r:named_var_run_t named

在var子目录log目录中建立named目录,更改context为:
[root@localhost log]# ls -Z
drwxr-x---  root root system_ubject_r:named_log_t    named

最后将/var/named目录的所有者递归的更改为named用户:

chown -R named:named /var/named/

bind的rpm包中将部分目录更改为770。但是我认为除了named用户之外,即便是同组的人也是不应该
看见一些重要文件的。

更改重要目录的权限:
chmod -R 700 /var/named/etc
chmod -R 700 /var/named/var

并将其子目录的权限更改,使非named组的用户权限为0.
如系统中不存在named组和named用户,使用命令建立。
groupadd named
useradd -g named -d /usr/local/named -s /sbin/nologin named

最后,提取bind rpm包中的/etc/init.d/named文件,拷贝到/etc/init.d/目录下,更改
context类型为initrc_exec_t.
因为我们既要使用selinux,又要使用chroot环境,因此需要修改该文件,
在第一个$ROOTDIR变量使用之前的任意地方添加:
ROOTDIR=/var/named

这时我们要成功启动named,我们必须建立几个合适的配置文件和数据文件,否则会提示配置错误。
为简单,最好先配置cache-only DNS服务器。
所需文件为:
(1)/etc/named.conf
(1)/etc/rndc.conf
(1)/var/named/var/named/named.local

文件(1)我们已经创建开始,但仅仅这样是不够的,修改后大概如下:
;
;  comment line should start with semicolon.
;

key "rndc-key" {
        ;
        ; Here is a secure section, so I don't show it to you
        ;
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
        directory "/var/named";
        pid-file "/var/run/named/named.pid";
        forwarders { 10.0.90.68;202.101.224.69;};
        forward only;
};


controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};

zone "." {
        type hint;
        file "named.ca";
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};

; end

***这里有一点非常重要,就是pid-file的位置。如果你直接指定为named.pid
.那么你是不会启动成功的,原因正如我上面所说的那样,named.pid将会在chroot后
的/var/named/中建立,而这正是数据文件存放的位置,而且被标记为named_zone_t.
只有root用户才有能力在该目录执行写权限,所以你是建立不了named.pid,也就因此
无法成功。
这一点你可以通过查看内核avc日志看到:类似如下:
type=AVC msg=audit(1176430065.896:78): avc:  denied  { write }
for  pid=3194 comm="named" name="named" dev=hda5 ino=384623
scontext=user_u:system_r:named_t:s0
tcontext=system_ubject_r:named_zone_t:s0 tclass=dir

网上出现的好多这样问题,应该就是由于pid文件位置不对而造成的。
当然可以通过简单的/usr/sbin/setsebool named_write_master_zones true
来解决。但是根据我上面提到的手册页说述,并不是个好方法,而且网上很多兄弟,竟然采用
关闭selinux的方法来解决。我真想骂这样的管理员一顿。

所以最好把pid文件放到/var/run/named/named.pid(chroot后) 中。
避免这样的问题。

文件(2)我们不必修改。
文件(3)内容如下:

[root@localhost named]# cat named.local
;
; /var/named/named.local Reverse mapping of 127.0.0
; Origin is 0.0.127.in-addr.arpa
;

$TTL 86400
@ IN SOA localhost. root.localhost. (
        1997022700 ; Serial
        28800 ; Refresh
        14400 ; Retry
        3600000 ; Expire
        86400
) ; Minimum

@ IN NS localhost.
1 IN PTR localhost.

此文件的内容在每个人的DNS中都是差不多相同的(当然你可以修改数值)。

当一切配置妥当之后我们可以使用
配置好后使用/etc/init.d/named start
或者/usr/sbin/run_init /etc/init.d/named start (需要登录用户密码)  启动.

最后看下运行情况:
[root@localhost named]# /etc/init.d/named start
……
[root@localhost named]# ps auxZ | grep named
user_u:system_r:named_t         named     4766  0.0  0.8  40096  6396 ?        Ssl  11:13   0:00 /usr/sbin/named -u named -t /var/named
user_u:system_r:unconfined_t    root      4779  0.0  0.0   4124   668 pts/1    R+   11:15   0:00 grep named

最后看一下是否能够正常工作:
修改本机使用的nameserver.
[root@localhost named]# cat /etc/resolv.conf
search localdomain
nameserver 10.0.191.163
#nameserver 10.0.90.68
#nameserver 202.101.224.69

[root@localhost bin]# ./nslookup
> www.kernel.org
Server:         10.0.191.163
Address:        10.0.191.163#53

Non-authoritative answer:
www.kernel.org  canonical name = zeus-pub.kernel.org.
Name:   zeus-pub.kernel.org
Address: 204.152.191.5
Name:   zeus-pub.kernel.org
Address: 204.152.191.37
> exit

[root@localhost bin]#

.简单的cache-only DNS配置就完成了。
如果要想使其他的用户可以使用自己的DNS,你需要开启防火墙的tcp,upd的53号端口。
你可以使用图形界面来修改,也可以使用命令行模式的iptables.最终还是靠iptables.
这是我/etc/sysconfig/iptables中的内容。
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT

如果你没有使用内置的防火墙,而自己建立的规则,可以作适当的修改添加到该链上。
比如:
/sbin/iptables -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
/sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT

不过记住添加的iptables规则在下次重新启动后会丢失,你可能需要添加到rc.local文件中,或者
使用iptables-save保存。


靠:搞毛东西啊,弄些破表情,想取消都取消不了。发个帖子要分******的好几节。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表