??xml version="1.0" encoding="utf-8" standalone="yes"?>
[root@jumper usr]# free
total used free shared buffers cached
Mem: 513980 493640 20340 0 143808 271780
-/+ buffers/cache: 78052 435928
Swap: 1052248 21256 1030992
2.在空间合适处创徏swap文g
[root@jumper usr]# mkdir swap
[root@jumper usr]# cd swap
[root@jumper swap]# dd if=/dev/zero of=swapfile bs=1024 count=10000
10000+0 records in
10000+0 records out
[root@jumper swap]# ls -al
total 10024
drwxr-xr-x 2 root root 4096 7?28 14:58 .
drwxr-xr-x 19 root root 4096 7?28 14:57 ..
-rw-r--r-- 1 root root 10240000 7?28 14:58 swapfile
[root@jumper swap]# mkswap swapfile
Setting up swapspace version 1, size = 9996 KiB
3.Ȁzswap文g
[root@jumper swap]# swapon swapfile
[root@jumper swap]# ls -l
total 10016
-rw-r--r-- 1 root root 10240000 7?28 14:58 swapfile
[root@jumper swap]# free
total used free shared buffers cached
Mem: 513980 505052 8928 0 143900 282288
-/+ buffers/cache: 78864 435116
Swap: 1062240 21256 1040984
[root@jumper swap]#
SwapQ即交换区,除了安装Linux的时候,有多h兛_q它呢?其实QSwap的调整对Linux服务器,特别是Web服务器的性能臛_重要。通过调整SwapQ有时可以越q系l性能瓉Q节省系l升U费用?nbsp;
本文内容包括Q?nbsp;
Swap基本原理
H破128M Swap限制
Swap配置Ҏ能的媄?nbsp;
Swap性能监视
有关Swap操作的系l命?nbsp;
Swap基本原理
Swap的原理是一个较复杂的问题,需要大量的幅来说明。在q里只作单的介绍Q在以后的文章中和大家详细讨论Swap实现的细节?nbsp;
众所周知Q现代操作系l都实现?虚拟内存"q一技术,不但在功能上H破了物理内存的限制QɽE序可以操纵大于实际物理内存的空_更重要的是,"虚拟内存"是隔L个进E的安全保护|,使每个进E都不受其它E序的干扰?nbsp;
Swap I间的作用可单描qCؓQ当pȝ的物理内存不够用的时候,需要将物理内存中的一部分I间释放出来Q以供当前运行的E序使用。那些被释放的空间可能来自一些很长时间没有什么操作的E序Q这些被释放的空间被临时保存到SwapI间中,{到那些E序要运行时Q再从Swap中恢复保存的数据到内存中。这PpȝL在物理内存不够时Q才q行Swap交换?nbsp;
计算机用户会l常遇这U现象。例如,在用WindowspȝӞ可以同时q行多个E序Q当你切换到一个很长时间没有理会的E序Ӟ会听到硬?哗哗"直响。这是因个程序的内存被那些频J运行的E序l?偯"了,攑ֈ了SwapZ。因此,一旦此E序被放|到前端Q它׃从Swap区取回自q数据Q将其放q内存,然后接着q行?nbsp;
需要说明一点,q不是所有从物理内存中交换出来的数据都会被放到Swap中(如果q样的话QSwap׃不堪重负Q,有相当一部分数据被直接交换到文gpȝ。例如,有的E序会打开一些文ӞҎ件进行读写(其实每个E序都至要打开一个文Ӟ那就是运行程序本w)Q当需要将q些E序的内存空间交换出LQ就没有必要文仉分的数据攑ֈ SwapI间中了Q而可以直接将其放到文仉厅R如果是L件操作,那么内存数据被直接释放,不需要交换出来,因ؓ下次需要时Q可直接从文件系l恢复;如果是写文gQ只需要将变化的数据保存到文g中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要SwapI间Q因为它们在文gpȝ中没有相应的"储备"文gQ因此被UC"匿名"(Anonymous)内存数据。这cL据还包括堆栈中的一些状态和变量数据{。所以说QSwap I间?匿名"数据的交换空间?nbsp;
H破128M Swap限制
l常看到有些LinuxQ国内汉化版Q安装手册上有这L说明QSwapI间不能过128M。ؓ什么会有这U说法?在说?128M"q个数字的来历之前,先给问题一个回{:现在Ҏ不存?28M的限Ӟ现在的限制是2GQ?nbsp;
Swap I间是分늚Q每一늚大小和内存页的大一P方便SwapI间和内存之间的数据交换。旧版本的Linux实现SwapI间Ӟ用SwapI间的第一作为所有SwapI间늚一?位映?QBit mapQ。这是说第一늚每一位,都对应着一SwapI间。如果这一位是1Q表C此Swap可用Q如果是0Q表C此|坏块Q不能用。这么说来,W一个Swap映射位应该是0Q因为,W一Swap是映页。另外,最?0个映位也被占用Q用来表CSwap的版本(原来的版本是Swap_space Q现在的版本是swapspace2Q。那么,如果说一늚大小为sQ这USwap的实现方法共能管?8 * ( s - 10 ) - 1"个Swapc对于i386pȝ来说s=4096Q则I间大小׃ؓ133890048Q如果认?1 MB=2^20 Byte的话Q大正好ؓ128M?nbsp;
之所以这h实现SwapI间的管理,是要防止SwapI间中有坏块。如果系l检查到Swap中有坏块Q则在相应的位映上标记?Q表C此不可用。这样在使用SwapӞ不至于用到坏块,而ɾpȝ产生错误?nbsp;
现在的系l设计者认为:
1.现在盘质量很好Q坏块很?nbsp;
2.q有,也不多,只需要将坏块|列出来Q而不需要ؓ每一徏立映?nbsp;
3.如果有很多坏块,׃应该此盘作ؓSwapI间使用?nbsp;
于是Q现在的Linux取消了位映射的方法,也就取消?28M的限制。直接用地址讉KQ限制ؓ2G?nbsp;
Swap配置Ҏ能的媄?nbsp;
分配太多的SwapI间会浪费磁盘空_而SwapI间太少Q则pȝ会发生错误?nbsp;
如果pȝ的物理内存用光了Q系l就会跑得很慢,但仍能运行;如果SwapI间用光了,那么pȝ׃发生错误。例如,Web服务器能Ҏ不同的请求数量衍生出多个服务q程Q或U程Q,如果SwapI间用完Q则服务q程无法启动Q通常会出?application is out of memory"的错误,严重时会造成服务q程的死锁。因此SwapI间的分配是很重要的?nbsp;
通常情况下,SwapI间应大于或{于物理内存的大,最不应小?4MQ通常SwapI间的大应是物理内存的2-2.5倍。但Ҏ不同的应用,应有不同的配|:如果是小的桌面系l,则只需要较的SwapI间Q而大的服务器pȝ则视情况不同需要不同大的SwapI间。特别是数据库服务器和Web服务器,随着讉K量的增加Q对SwapI间的要求也会增加,具体配置参见各服务器产品的说明?nbsp;
另外QSwap分区的数量对性能也有很大的媄响。因为Swap交换的操作是盘IO的操作,如果有多?Swap交换区,SwapI间的分配会以轮的方式操作于所有的SwapQ这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区Q所有的交换操作会交换区变得很忙,使系l大多数旉处于{待状态,效率很低。用性能监视工具׃发现Q此时的CPUq不很忙Q而系l却慢。这说明Q瓶颈在 IO上,依靠提高CPU的速度是解决不了问题的?nbsp;
pȝ性能监视
SwapI间的分配固然很重要Q而系l运行时的性能监控却更加有价倹{通过性能监视工具Q可以检查系l的各项性能指标Q找到系l性能的瓶颈。本文只介绍一下在Solaris下和Swap相关的一些命令和用途?nbsp;
最常用的是Vmstat命oQ在大多数Unixq_下都有这样一些命令)Q此命o可以查看大多数性能指标?nbsp;
例如Q?nbsp;
# vmstat 3
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99
0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100
0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100
............
命o说明Q?nbsp;
vmstat 后面的参数指定了性能指标捕获的时间间隔?表示每三U钟捕获一ơ。第一行数据不用看Q没有h|它仅反映开Z来的q_性能。从W二行开始,反映每三U钟之内的系l性能指标。这些性能指标中和Swap有关的包括以下几:
procs下的w
它表C当前(三秒钟之内)需要释攑ֆ存、交换出ȝq程数量?nbsp;
memory下的swpd
它表CZ用的SwapI间的大?nbsp;
Swap下的siQso
si表示当前Q三U钟之内Q每U交换回内存QSwap inQ的总量Q单位ؓkbytesQso表示当前Q三U钟之内Q每U交换出内存QSwap outQ的总量Q单位ؓkbytes?nbsp;
以上的指标数量越大,表示pȝ忙。这些指标所表现的系l繁忙程度,与系l具体的配置有关。系l管理员应该在^时系l正常运行时Q记下这些指标的数|在系l发生问题的时候,再进行比较,׃很快发现问题Qƈ制定本系l正常运行的标准指标|以供性能监控使用?nbsp;
另外Q用Swapon-s也能单地查看当前Swap资源的用情c例如:
# swapon -s
Filename Type Size Used Priority
/dev/hda9 partition 361420 0 3
能够方便地看出SwapI间的已用和未用资源的大?nbsp;
应该使Swap负蝲保持?0%以下Q这h能保证系l的良好性能?nbsp;
有关Swap操作的系l命?nbsp;
增加SwapI间Q分以下几步Q?nbsp;
1)成ؓ用户
$su - root
2)创徏Swap文g
# dd if=/dev/zero of=swapfile bs=1024 count=65536
创徏一个有q箋I间的交换文件?nbsp;
3)ȀzSwap文g
#/usr/sbin/swapon swapfile
swapfile指的是上一步创建的交换文g?nbsp;4)现在新加的Swap文g已经起作用了Q但pȝ重新启动以后Qƈ不会C前几步的操作。因此要?etc/fstab文g中记录文件的名字Q和SwapcdQ如Q?nbsp;
/path/swapfile none Swap sw,pri=3 0 0
5)验Swap文g是否加上
/usr/sbin/swapon -s
删除多余的SwapI间?nbsp;
1)成ؓ用户
2)使用Swapoff命o收回SwapI间?nbsp;
#/usr/sbin/swapoff swapfile
3)~辑/etc/fstab文gQ去掉此Swap文g的实体?nbsp;
4)从文件系l中回收此文件?nbsp;
#rm swapfile
5)当然Q如果此SwapI间不是一个文Ӟ而是一个分区,则需创徏一个新的文件系l,再挂接到原来的文件系l上?/p>
Copyright © 2004Q?005Q?本文遵从GNU 的自由文档许可证(Free Document License)的条ƾ,Ƣ迎转蝲、修攏V散布?/p>
发布旉:2004q?4?7?/p>
最q更?2005q?8?8?/p>
Abstract
LDAP (轻量U目录服务访问协议,Lightweight Directory Access Protocol)ZX.500标准Q支持TCP/IPQ用简单方ѝ现在越来越多的|络应用pȝ都支持LDAP。OpenLDAP是LDAP的一U? 开源实玎ͼ本笔记基于OpenLDAP2.1.29?/p>
Table of Contents
Table of Contents
? 录是一个ؓ查询、浏览和搜烦而优化的专业分布式数据库Q它成树状结构组l数据,好象Linux/Unixpȝ中的文g目录一栗目录数据库和关pL据库 不同Q它有优异的L能Q但写性能差,q且没有事务处理、回滚等复杂功能Q不适于存储修改频繁的数据。所以目录天生是用来查询的,好象它的名字一栗目 录服务是q录数据库和一套访问协议组成的pȝ。类g下的信息适合储存在目录中Q?/p>
企业员工和企业客户之cMh员信息;
公用证书和安全密钥;
邮g地址、网址、IP{电脑信息;
电脑配置信息?/p>
...
现在国际上的目录服务标准有两个,一个是较早的X.500标准Q一个是较新的LDAP标准?/p>
X.500是一个协议族Q由一pd的概念和协议l成Q包括:
X.501是模型定义,定义目录服务的基本模型和概念Q?/p>
X.509是认证框Ӟ定义如何处理目录服务中客户和服务器认证;
X.511是抽象服务定义,定义X.500提供的功能性服务;
X.518是分布式操作q程定义Q定义如何跨q_处理目录服务Q?/p>
X.519 是协议规范,定义了X.500协议Q包括DAP(Directory Access ProtocolQ目录访问协?、DSP(Directory System ProtocolQ目录系l协?、DOP(Directory Operator ProtocolQ目录操作绑定协?、DISP(Directory Information Shadowing ProtocolQ目录信息阴影协?)Q?/p>
X.520定义属性类型要求;
X.521定义对象cdQ?/p>
X.525定义如果在目录服务器间复制内宏V?/p>
X.500标准中定义了很多内容Q包括:
定义了信息模型,定目录中信息的格式和字W集Q如何在中表示目录信息(定义对象cR属性等模式)Q?/p>
定义命名I间Q确定对信息q行的组l和引用Q如何组l和命名?目录信息树DIT和层ơ命名模型;
定义功能模型Q确定可以在信息上执行的操作Q?/p>
定义认证框架Q保证目录中信息的安全,如何实现目录中信息的授权保护-讉K控制模型Q?/p>
定义分布操作模型Q确定数据如何分布和如何对分布数据执行操作,如何全局目录树划分ؓ理域,以便理?/p>
定义客户端与服务器之间的通信的各U协议?/p>
׃X.500较复杂,且需严格늅OSI七层协议模型。造成应用开发较困难。所以开发了LDAPQ以便在INTERNET上用?/p>
LDAP协议?993q获批准Q生LDAPv1版,1997q发布最新的LDAPv3版,该版本是LDAP协议发展的一个里E碑Q它作ؓX.500的简化版提供了很多自有的Ҏ,使LDAP功能更ؓ完备Q具有更强大的生命力?/p>
LDAP也是一个协议族Q包含以下内容:
RFC 2251--LDAPv3核心协议Q定义了LDAPv3协议的基本模型和基本操作Q?/p>
RFC 2252--定义LDAPv3基本数据模式(Schema)(包括语法、匹配规则、属性类型和对象c?以及标准的系l数据模式;
RFC 2253--定义LDAPv3中的分辩?DN)表达式;
RFC 2254--定义了LDAPv3中的qo表达式;
RFC 2255--定义LDAPv3l一资源地址的格式;
RFC 2256--定义LDAPv3中用X.500的Schema列表Q?/p>
RFC 2829--定义了LDAPv3中的认证方式Q?/p>
RFC 2830--定义了如何通过扩展使用TLS服务Q?/p>
RFC 1823--定义了C的LDAP客户端API开发接口;
RFC 2847--定义了LDAP数据导入、导出文件接口LDIF?/p>
q些协议定义了LDAP的内容,包括Q?/p>
定义了一个信息模型,定了LDAP目录中信息的格式和字W集Q如何表C目录信?定义对象cR属性、匹配规则和语法{模?Q?/p>
定义了命名空_定信息的组l方?-目录树DITQ以DN和RDN为基的命名方式,以及LDAP信息的Internet表示方式Q?/p>
定义了功能模型,定在可以在信息上执行的操作及API?/p>
定义了安全框Ӟ保证目录中信息的安全Q定义匿名、用户名/密码、SASL{多U认证方式,以及与TLSl合的通讯保护框架Q?/p>
定义分布式操作模型,Z指引方式的分布式操作框架Q?/p>
定义了LDAP扩展框架?/p>
Table of Contents
我的安装Ҏ是以源码~译的方式进行的Q以root用户q行安装。安装所需软g如下Q?/p>
具体的安装步骤如下:
׃openldap需要Berkeley DB来存放数据,所以需先安装Berkeley DB 4.2.52Q可到它的网站下载,|址见上面。运行下面的命o解压Q?/p>
# tar -zxvf db-4.2.52.tar.gz
解完压后Q会生成一个db-4.2.52目录,q行该目录下的build_unix目录。执行以下命令进行配|安装?/p>
# ../dist/configure
# make
# make install
也是按linux源码安装的三步曲完成Q没有什么好说的了。该软g默认是安装在/usr/local/BerkeleyDB.4.2? 录下。安装完成后Q要?usr/local/BerkeleyDB.4.2/lib的库路径加到/etc/ld.so.conf文g内,d完成后执? 一ơldconfigQ配置文g生效。这L译openldap时才能找到相应的库文件。这栯料库安装完成了Q接下来可以安装openldap了? ld.so.conf是什么东西?它就是系l动态链接库的配|文件。此文g?存放着可被LINUX׃n的动态链接库所在目录的名字(pȝ目录/lib, /usr/lib除外)Q各个目录名间以I白字符(I格Q换行等)或冒h逗号分隔。一般的LINUX发行版中Q此文g均含一个共享目? /usr/X11R6/libQؓX windowH口pȝ的动态链接库所在的目录? ldconfig是它的管理命令,具体操作Ҏ可查询man手册Q这里就不细讲了?/p>
到openldap官方|站下蝲最? 的稳定版源码Qƈ解压。查看INSTALLT 和README文档Q这个很重要Q因为安装方法和一些注意事w在里面有介绍。认真弄明白文档内容能节省你不少的安装调试时间。这也是开源Y件的一个特 点,l用h供了最大的灉|性和可配|性。但也增加了pȝ安装配置的难度,需要有相关的文档配|说明和指导。在官方|站上还有详l的帮助文gQ在整个pȝ 配置中需要经常查询?/p>
# tar -zxvf openldap-stable-20040329.tgz
解压完成后,会生成一个openldap-2.1.29目录。进行该目录Q执行以下命令进行配|安装?/p>
# env CPPFLAGS="-I/usr/local/BerkeleyDB.4.2/include"
LDFLAGS="-L/usr/local/BerkeleyDB.4.2/lib" ./configure --prefix=/usr/local/openldap
--enable-ldbm
注意以上配置语句Q要讄资料库的include和lib路径Q否则在配置到资料库相关内容时会提示Berkeley DB版本不兼容,q中断配|。如果没?-enable-ldbm选项Q在make test时会提示ldbm找不到。ؓ了减出错,q是加上为好?/p>
#make depens
#make
#make test
在make test阶段要花费较长时间进行测试,好像?6吧。你可以放松一下,上上|,聊聊天,听听歌,呵呵Q开玩笑了,q个旉应该是最紧张的了。成与不成就看这下的了,如果没问题就可安装了?/p>
#make install
通过配置命o可以看出Q我们把openldap安装?usr/local/openldap目录下。徏议以源码安装的Y仉攑ֈ独立的目录下Q不要放到Y仉认的目录。好处是方便理和控Ӟ所有文件在l一的目录下Q卸载Y件只要删除整个目录就可以了?/p>
? 装完相关软g后就可以着手配|了。Berkeley DB资料库没什么好配置的。主要是配置openldap 服务。配|文件在软g的安装目录的etc/openldap下,有四个文Ӟ主要的是slapd.conf and ldap.confQ其它两个是backup文g。首先,我们先来配置slapd.conf文档。系l默认的slapd.conf文g如下Q?/p>
# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/openldap/etc/openldap/schema/core.schema
#讄schema配置文档包含
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /usr/local/openldap/var/slapd.pid
#讄pid和args文档位置
argsfile /usr/local/openldap/var/slapd.args
# Load dynamic backend modules:
# modulepath /usr/local/openldap/libexec/openldap
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy is:
# Allow read by all
#
# rootdn can always write!
#######################################################################
# ldbm database definitions
#######################################################################
database bdb
#讄使用的资料库Q也可用lbdm?br />suffix "dc=my-domain,dc=com"
#讄目录后缀
rootdn "cn=Manager,dc=my-domain,dc=com"
#讄目录理?br /># Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
#讄理密码Q这里用了明文的“secret”密码。这栯|不安全Q需使用加密的密码,下面会讲到如何设|加密密码?br /># The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /usr/local/openldap/var/openldap-data
#讄资料库\?br /># Indices to maintain
index objectClass eq
#讄目录烦?br />
要服务器正常动作Q要修改一些始初参数和讄Q修改后的配|文档如下:
# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
#Z有效使用目录服务Q包含相关的文g。注意,在包含文件时是要按一定顺序的Q因?br />#文g里的属性存在依赖关pR如果顺序不对,服务器启动不了,文档间的依赖关系在文?br />#中都有说明,请仔l查看一下。如果懒得看也可以按我的序?br />include /usr/local/openldap/etc/openldap/schema/core.schema
include /usr/local/openldap/etc/openldap/schema/corba.schema
include /usr/local/openldap/etc/openldap/schema/cosine.schema
include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema
include /usr/local/openldap/etc/openldap/schema/misc.schema
include /usr/local/openldap/etc/openldap/schema/openldap.schema
include /usr/local/openldap/etc/openldap/schema/nis.schema
include /usr/local/openldap/etc/openldap/schema/samba.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /usr/local/openldap/var/slapd.pid
argsfile /usr/local/openldap/var/slapd.args
loglevel 1
#增加了日志功能,需修改syslog配置文gQ在文g中增加一:local4.* /var/log/ldap.log日志U别定义可查相官方网站的文档?br />#1U记录的信息很多Q可用于调试?br /># Load dynamic backend modules:
# modulepath /usr/local/openldap/libexec/openldap
# moduleload back_bdb.la
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la
# Sample security restrictions
# Require integrity protection (prevent hijacking)
# Require 112-bit (3DES or better) encryption for updates
# Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyone to read it
# Subschema (sub)entry DSE: allow anyone to read it
# Other DSEs:
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
# Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy is:
# Allow read by all
#
# rootdn can always write!
#######################################################################
# ldbm database definitions
#######################################################################
database bdb
suffix "dc=it,dc=com"
#Ҏ你自已的目录后缀Q?br />rootdn "cn=root,dc=it,dc=com"
#讄root为管理员Q与linux的root没有什么关pR?br /># Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw {MD5}mjkiuPt0wXhpxxkdiOOO+0000000AKq0by
#讄root密码Q用MD5加密。密码串用slappasswd -h {MD5}指o生成
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /usr/local/openldap/var/openldap-data
# Indices to maintain
index objectClass eq
#q里可根据你的需要设|相关烦引,以加快查询速度。具体内容可查询官方|站理手册?br />
#ACL configure以下内容定义讉K控制
access to attr=userPassworduserPassword
#只能p已修改,有效验证用户查询?br /> by self write
by anonymous auth
access to attr=mail
by dn="cn=root,dc=it,dc=tigerhead" writemail
#只能p已修改,有效验证用户查询?br /> by self write
by anonymous auth
access to dn=".*,dc=it,dc=tigerhead"
#允许所有h查询没受控制讉K限制的信息?br /> by self write
by * read
到现在ؓ止,服务器基本就配置完成了,可以启动了,服务器程序是位于安装目录的libexec下的slapdE序。注意,不是 sldap哦。okQ到现在为止Q服务器基本配|完成了Q可以启动了Q服务器E序是位于安装目录的libexec下的slapdE序。注意,不是 sldap哦。启动服务器执行以下命oQ?/p>
# ./slapd
如果没有提示什么出错信息,直接q回shell状态,p明服务器正常启动了,你可以查询日志或用ps -aux查看。或用以下命令查询服务器:
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
如果命o执行成功Q返回一些信息,则说明服务器正常q行了。如果启动不成功Q它会提CZ些出错信息,多数是slapd.conf配置出错。回头仔l核查一下配|文档?/p>
客户端配|文档是ldap.conf。该文档相当单,其实不用配置也能正常操作?/p>
# $OpenLDAP: pkg/ldap/libraries/libldap/ldap.conf,v 1.9 2000/09/04 19:57:01 kurt Exp $
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=it, dc=com讄目录L
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
? 务器正常q作后,可以录入信息了。信息的录入有三U方法,一U是手工录入Q一U是.ldif文g格式录入Q一U是脚本自动录入。我们先从最基础的手工录 入方式开始介l,了解录入信息的格式。明白了手工录入的格式,其它两种方式都很Ҏ明白。信息录入用到ldapaddq个E序。可在安装目录的bin目录 下找到?/p>
W一步是要徏立DNQ?/p>
# ldapadd -x -D 'cn=root,dc=it,dc=com' -W
dn: dc=it,dc=com
objectClass: dcObject
objectClass: organization
dc: it
o: Corporation
description: d Corporation
注意Q如果你用复?_脓功能把以上内Ҏ贝过去,一定要注意每行后面不要有空|q是手工输入Q按Ctrl+d存盘?br />
W二步是建立RDN:
# ldapadd -x -D 'cn=root,dc=it,dc=com' -W
#-x表示用简单验证,-D表示指定目录Q?W表示弹出密码输入提示
输入密码Q这里的密码是在配置文g中rootpw设|的密码Q不是操作系l中root用户的密码。验证通过后就可输入以下内容:
dn: uid=qq,dc=it,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: qq
cn: qq
sn: qq
telephoneNumber: 138888888
description: openldap test
telexNumber: tex-8888888
street: my street
postOfficeBox: postofficebox
displayName: qqdisplay
homePhone: home1111111
mobile: mobile99999
mail:qq@qq.com
输入完所有信息后Q按Ctrl+dl束存盘。如果出现出错信息,h一下对象类和属性的对应关系有没有错或输入失误。初学者就Ҏ出错 的地Ҏ对象cd属性的对应关系没有处理好。对象类和属性是在schema文档中定义的。它们之间的关系是这LQ对象类中有些属性是必选的Q有些属性是 可选的。录入信息的属性必d对象cM有定义才能用?/p>
输入以下命o可查询到刚才输入的信息?/p>
# ldapsearch -x -b 'dc=it,dc=com'
-b选项是设|目录v点,如果讄了客L的BASE配置参数Q该可不用?br />
如果按以上配|文件设|了aclQ用上面的查询命令是查询不到受保护的内容的。如上面的userPassword and mail。要查询到这些受限内容,需要通过验证才可以:
# ldapsearch -x -LLL -h it.com -b 'dc=it,dc=com' -D 'uid=qq,dc=it,dc=com' -W 'uid=qq'
接着提示输入密码。输入userPassword的密码回车,所有信息就都出来了?br />
.ldif文g方式也就是把以上手工输入的内容先写入一?ldif文g中,然后Q用ldapadd命o?f参数导入?/p>
# ldapadd -x -D "cn=root,dc=it,dc=com" -W -f test.ldif
一个完整的global.ldif文g例子Q?/p>
dn: dc=info, dc=net
objectClass: top
objectClass: organization
o: info.net
dn: ou=People, dc=info, dc=net
objectClass: top
objectClass: organizationalUnit
ou: People
description: User Info
dn: cn=Admin, dc=info, dc=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: Admin
sn: Admin
userPassword: Admin
description: Administrator for info.net
dn: id=1, ou=People, dc=info, dc=net
objectclass: top
objectclass: InfoPerson
id: 1
username: 张三
tel:021-63138990
card_id:ABC001
我们也可用slapadd命o来导入数据。该命o可以导入包含一些系l信息的ldif文gQ如Q?/p>
dn: dc=it,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: it
structuralObjectClass: organization
entryUUID: d97b06da-d77e-1028-9866-d4ec7ac00d12
creatorsName: cn=anonymous #pȝ信息
createTimestamp: 20041201005115Z #pȝ信息
o:: 5bm/5bee5biC6JmO5aS055S15rGg6ZuG5Zui5pyJ6ZmQ5YWs5Y+4
userPassword:: e01ENX14TXBDT0tDNUk0SU56RkNhYjNXRW13PT0=
entryCSN: 2004120603:50:08Z#0x0001#0#0000 #pȝ信息
modifiersName: cn=admin,dc=it,dc=com #pȝ信息
modifyTimestamp: 20041206035008Z #pȝ信息
![]() | |
再次提醒Q注意每行后面不要留有空根{?/td> |
接着为大家介l一下几个常用的ldap命oQ如果你用了phpLDAPadminE序Q其实它已经有一个很好的囑Ş介面帮你完成q些命o了。但了解一下还是对你还是很有益的,因ؓ命oҎ才是最Ҏ的?/p>
删除命oldapdelete
# ldapdelete -x -D 'cn=root,dc=it,dc=com' -W 'uid=qq1,dc=it,dc=com'
重新索引ldap数据库命令slapindex
# slapindex -f slapd.conf
讄使用者密码,当然了,你的用户需要有userPassword了?/p>
#ldappasswd -x -D "cn=root,dc=it,dc=com" -W "uid=qq1,dc=it,dc=com" -S
New password:
Re-enter new password:
Enter bind password:
Result: Success (0)
![]() | |
"Enter bind password" ?"cn=root,dc=it,dc=com"理员的密码?/td> |
理员密码更?
#slappasswd
New password
Re-enter new password
{SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs
接下再拷贝到 path/to/sldap.conf ?rootpw 卛_,重启使用配置文g生效
通过ldapmodify修改目录内容
# ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif
通过ldif文g修改ldap数据Qldif文g格式如下Q?/p>
dn: cn=qq,dc=it,dc=com
changetype: modify
replace: mail
mail: modme@example.com
-
add: title
title: Grand Poobah
-
add: jpegPhoto
jpegPhoto:< file:///tmp/modme.jpeg
-
delete: description
-
前提是你在系l中安装了sasl认证库,q在~译openldap时支持它Q默认就支持了。到http://asg.web.cmu.edu/cyrus下蝲。安装方法见我写的sendmail安装W记。安装好之后Q需要在sasl中徏立相应的帐号Q用以下命o可完成?/p>
# saslpasswd2 -c test
接着配置slapd.conf文gQ加入以下内宏V?/p>
sasl-regexp
uid=(.*),cn=.*,cn=auth
uid=$1,dc=it,dc=com
重启服务器配置文g生效。这个配|是最大权限的配置Q如果要l化h阅相x档。用以下命o试?/p>
# ldapsearch -U qq -b 'uid=qq,dc=it,dc=com' -D 'dc=it,dc=com' -Y DIGEST-MD5
采用digest-md5验证,提示密码Q输入saslpasswd2的密码?/p>
? 一些关键的应用场合Q我们需讄多个ldap服务器实例,且数据要保持同步。当一台服务器出现故障或被黑客dӞ我们pl箋保持应用的正常运行。通过 DNS的轮查询功能,q能实现服务器的负蝲均衡Q提高响应速度。在openldap中有一个slurpdq程Q利用slurpdq程可帮助我们实现多? ldap服务器数据的同步功能。下面简单介l一下主、从ldap服务器的配置?/p>
slurpdq行在主服务器上Q它能把L务器上的变化通过 LDAP协议传送到从服务器上。从服务器上的变化不能传送到L务器上,也就是说是单向同步的。主从服务器的版本最好一P以减兼Ҏ问题。主从服务器 的安装方法是一LQ关键是配置文g有所不同。我的操作系l是debian sargeQ在保M服务器能正常q行的前提下q行以下配置Q?/p>
首先Q把M服务器关闭。通过以下三步操作静态同步主从服务器上的数据Q?/p>
把主服务器上/var/lib/ldap目录下的所有数据库文g全部拯C服务器的同目录中Q覆盖原有文件?/p>
把主服务器上?etc/ldap/schema目录下的所有schema文g拯C服务器的同目录中Q覆盖原有文件?/p>
把主服务器上/etc/ldap/slapd.conf文g拯C服务器的同目录中Q覆盖原有文件?/p>
配置L务器上的slapd.conf文gQ取消replogfile指o前的注释W号Q取消后的结果如下:
# Where to store the replica logs for database #1
replogfile /var/lib/ldap/replog
增加replica指oQ如Q?/p>
#replace config
replica uri=ldap://192.168.6.195:389 #指定从服务器L名和端口?br /> binddn="cn=admin,dc=com" #指定需同步的DN的管理员
bindmethod=simple credentials=1 #指定验证方式和需同步的DN的管理员密码
配置从服务器上的slapd.conf文gQ增加updatedn指oQ如Q?/p>
updatedn "cn=admin,dc=com" #与主服务器的binddn对应
在从服务器的配置文g中,不要包含replica和replogfile指o?/p>
先启动主服务器的slapd和slurpdQ再启动从服务器的slapd?/p>
配置完成后,我们可测试一下,在主服务器上修改一个目录项Q在从服务器上可查看目录的数据已同步?/p>
Table of Contents
开源的目录服务理工具有很多,包括phpldapadminQgqQCPUQJXplore{。这些工具可帮助我们方便l护目录服务器上的数据。这些工具各有优~点Q下面简要介l一下,详细的内容可参考相关的官方|站?/p>
Table of Contents
2006 q? 6 ? 26 ?/p>
使用轻量U目录访问协议(LDAPQ构建集中的w䆾验证pȝ可以减少理? 本,增强安全性,避免数据复制的问题,q提高数据的一致性。随着 Linux] 的不断成熟,已经出现了很多工L来简化用户帐号信息到 LDAP 目录的迁UR还开发了一些工L来在客户机和目录服务器之间启用加密通信配置Qƈ通过复制提供定w性。本文将向您展示如何配置服务器和客户机在 Red Hat Linux 上?OpenLDAP?/blockquote>Linux 发行版中提供?OpenLDAP 软g按照一个客h/服务器模型实C轻量U目录访问协议(LDAPQ。LDAP 的设计目的是提供一U有效的Ҏ来查扑֒理信息。OpenLDAP 软g和包提供了创建目录信息树Q一个主要进行读操作的数据库Q的工具。本文向您展C如何存储用L帐号信息Qƈ修改w䆾验证服务来?LDAP 获取所需要的信息。内部细节ƈ不重要,因ؓq些工具可以数据库的内容以文本格式QLDAP 数据交换格式QLDIFQ呈现在您的面前?/p>
LDAP 信息被组l成属性和值的l合Q称?条目QentryQ?/i>。条目可能会h必须的属性或可选属性。一个条目的属性必要遵@ /etc/openldap/schema/ 模式文g中定义的规则。规则包含在条目?objectclass 属性中。看一下下面的关系Q我们可以看?
posixAccount
objectclass 中包含了密码文g条目的信息(posixAccount userPassword
是文件条目的 base64 ~码Q?/p>
?1. LDAP 目录条目?Linux 密码文g之间的关p?/b>文g /etc/openldap/schema/nis.schema ?posixAccount 对象cM的条目定义了所有的属性和 objectclass。例如,下面是对
uidNumber
属性的描述Q?/p>attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
DESC 'An integer uniquely identifying a user in an administrative domain'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )所有的属性类型都已经定义了,它们被收集到
posixAccount
objectclass 中。例如:objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
DESC 'Abstraction of an account with POSIX attributes'
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ description ) )
ldapuser
条目h一个识别名属?dn
Q它用作用户名,q与userPassword
一L来在 LDAP 目录中记录信息,或与 LDAP 目录l定在一起用?/p>LDAP Z为容器用的Ҏ条目提供了将q些条目l织成树l构的功能。在q个例子中,我们用一个容?
People
保存用户帐号信息Q用另外一个容?Groups
保存l帐号信息。所生成的目录信息树如图 2 所C?/p>
?2. 用户帐号信息使用的目录信息树让我们来看一下如何配|?OpenLDAP 服务器,如何信息从pȝ文gq移?LDAP 目录中,如何配置 OpenLDAP 客户机通过 LDAP 对用戯行n份验证。在使用一个集中的w䆾验证数据库时Q应该通过使用复制技术采用第二个 LDAP 服务器提供高可用性,q样在主服务器出现问题时Q就可以使用W二?LDAP 服务器响应客h的请求。由于诸如密码之cȝw䆾验证数据会通过|络q行传输Q因此希望?TSL 协议建立加密通信q接?/p>
我们?OpenLDAP 服务器和客户机都是虚拟机Q上面运行的?Red Hat Enterprise Linux AS release 4QNahant Update 1Q。在我们的例子中使用??1 所列出的系l。如果想模仿q些例子Q请使用适合您自q讄?/p>
?1. pȝ|络信息
角色 L?/th> IP 地址 OpenLDAP L务器 dhcp64-233.ibm.com 9.47.64.233 OpenLDAP 从服务器 dhcp64-253.ibm.com 9.47.64.253 OpenLDAP 客户?/td> dhcp64-251.ibm.com 9.47.64.251
回页?/b> 我们使用 Red Hat Enterprise Linux release 4 Update 1 上的包来构徏服务器:
- openldap-2.2.13-2Q包?OpenLDAP 配置文g、库和文?/li>
- openldap-servers-2.2.13-2Q包?slapd ?slurpd 服务器、迁U脚本和相关文g
- openldap-clients-2.2.13-2Q包含客hE序Q用来访问和修改 OpenLDAP 目录
OpenLDAP 包在服务器上安装了很多程序:
- 守护q程Q?
- slapdQ主 LDAP 服务?/li>
- slurpdQ负责与复制 LDAP 服务器保持同步的服务?/li>
- 对网l上的目录进行操作的客户机程序。下面这两个E序是一对儿Q?
- ldapaddQ打开一个到 LDAP 服务器的q接Q绑定、修Ҏ增加条目
- ldapsearchQ打开一个到 LDAP 服务器的q接Q绑定ƈ使用指定的参数进行搜?/li>
- Ҏ地系l上的数据库q行操作的几个程序:
- slapaddQ将?LDAP 目录交换格式QLDIFQ指定的条目d?LDAP 数据库中
- slapcatQ打开 LDAP 数据库,q将对应的条目输Zؓ LDIF 格式
OpenLDAP 的主要服务器配置文g?/etc/openldap/slapd.conf。本例所使用的完?slapd.conf 文g?清单 18 所C。slapd.conf 文g中包括一pd全局配置选项Q它们作Z个整体应用到 slapd 上面Q后面是包含数据库特有信息的数据库后端定义。如果一行内Ҏ以空格开始的Q就认ؓ它是上一行的延箋。空行和???字符开头的注释行都会被忽略?/p>
如果您正把本文当作练习来做,那就可以按照下面指定的方式进行修改,从而启?LDAP 服务器。一旦确认服务器正常工作之后Q就可以d复制功能Q然后再d安全性支持。首先是全局配置信息D늚讄。其中每个选项的值都是我们想要的?/p>
正如上面介绍的一P信息被组l成属性和值的l合Q称为条目。条目属性必遵循的规则是?
objectclass
专用属性进行组l的Q这可以?/etc/openldap/schema/ 模式文g中找到。对于n份验证来_需要用在 nis.schema 中定义的posixAccount
?shadowAccount
objectclassesQ?/p>
include /etc/openldap/schema/nis.schema
loglevel
行设|的是日志选项。可以将其设|ؓq样的别:调试语句和操作统计信息都会被记录?/var/log/slapd.log 中。日志别是累加的:296 = 256 日志q接/操作/l果 + 32 搜烦qo器处?+ 8 q接理Q?/p>
loglevel 296
日志信息会被记录?syslogd LOG_LOCAL4 机制中。还需要将下面的内Ҏ加到 /etc/syslog.conf 中,q让 syslogd 重新d自己的配|文Ӟ
local4.debug /var/log/slapd.log
access 行定义了谁可以访问目录中的内宏V我们希望用户可以修改自q密码Qƈ更新自己?shadow 信息来反映密码的变化。希望n份验证程序能够检索用L密码。还希望用户能够d所有其他条目。注意密码条目是不可ȝQshadow 属性的惟一用处是理密码的过期问题?/p>
access to attrs=shadowLastChange,userPassword
by self write
by * auth
access to *
by * read接下来,?database 部分Q要定义下面的内宏V?/p>
使用新的 bdb 后端数据库:
database bdb
指定后端数据库需要响应的查询?DN 前缀。ؓ了确保惟一性,根前~应该从自q|络域名构徏出来。在本例的情况中Q它?.dc=svc,dc=beaverton,dc=ibm,dc=com.Q但是在下面的例子中我们对其q行了简化:
suffix "dc=ibm,dc=com"
指定理 DNQ它不用于访问控制或限制数据库的操作。也不需要在目录中ؓq个 DN 指定一个条目。ؓh rootpw 密码的管理员使用 DN 可以跌 ACL 规则中的所有访问控Ӟ
rootdn "cn=Manager,dc=ibm,dc=com"
rootpw {MD5}ijFYNcSNctBYgq就是我们现在想要设|的选项。稍后将q回 slapd.conf 文g来配|复Ӟ然后在配|安全性?/p>
现在Q我们希望将数据d到目录中Qƈ认可以讉Kq些信息。要实现q种功能Q需要配|服务器来?ldap 客户机工P例如 ldapadd ?ldapsearch。ldap 客户机工L配置文g? /etc/openldap/ldap.conf。我们用的q个文g的完整列表如本文末尾?清单 19 所C。要?ldap 服务器上q行q些工具Q只需要将该行修改成下面的内容Q?/p>
BASE dc=ibm,dc=com
讄启动脚本在?2? ?5 时启?LDAPQ?/p>
清单 1. 讄启动q行U别
# chkconfig --levels 235 ldap on从命令行中启动服务:
清单 2. 启动服务
# service ldap start
Starting slapd: [ OK ]OpenLDAP 守护q程 slapd 应该已经q行了:
清单 3. 查服务正在运?/b>
# ps -ef | grep slap
ldap 13521 1 0 Oct24 ? 00:00:00 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:///
ldapsearch -x
命o应该可以成功完成Q但不会q回M数据?/p>
回页?/b> Red Hat 所提供?openldap-servers 包包?PADL Software Pty Ltd. 公司? MigrationTools 工具。我们将使用q些工具数据从 Linux pȝ文gQ例?/etc/group ? /etc/passwordQ{换成 LDAP LDIF 格式Q这是数据库信息的一U文本格式的表示。这U格式是行界定、冒号分隔的属?值对?/p>
有一l?Perl 脚本被安装到 /usr/share/openldap/migration/ 中执行迁UR这?Perl 脚本的配|信息包含在 migrate_common.ph 文g的开头。对于我们的目的来说Q只需要修改命名前~的变量来使用条目的识别名p够了Q如下所C:
$DEFAULT_BASE = "dc=ibm,dc=com"
在进行这些修改之后,误行脚?migrate_base.plQ它会创建根,qؓ Hosts、Networks、Group ?People {创Z一U的l织单元Q?/p>
清单 4. q行 migrate_base.pl
# migrate_base.pl > base.ldif~辑 base.ldifQ删除除下面之外的所有条目:
清单 5. base.ldif 条目
# cat base.ldif
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain
dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit?LDAP 服务器上Q?OpenLDAP 客户机工?ldapadd 以下条目插入到数据库中。简单n份验证必要使用
-x
选项指定。在 slapd.conf 中定义的rootdn
w䆾验证识别名是 “cn=Manager,dc=ibm,dc=com”。对于简单n份验证来_必须使用密码。选项-W
强制提示输入密码。这个密码就是在 slapd.conf 文g中指定的rootpw
参数的倹{包含这些条目的 LDIF 文g是?-f
选项指定的:
清单 6. 使用 ldapadd 插入条目
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f base.ldif接下来,?/etc/group 中迁U?ldapuser l:
清单 7. q移 ldapuser l?/b>
# grep ldapuser /etc/group > group.in
# ./migrate_group.pl group.in > group.ldif
# cat group.ldif
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f group.ldif最后,?/etc/passwd ?/etc/shadow 中迁U?ldapuser 的信息:
清单 8. q移 ldapuser 信息
# grep ldapuser /etc/passwd > passwd.in
# ./migrate_passwd.pl passwd.in > passwd.ldif
# cat passwd.ldif
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f passwd.ldif现在查已l添加到数据库中的信息。清?9 l出了全部输出结果:
清单 9. ?LDIF 格式填充?OpenLDAP 数据?/b>
# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# ibm.com
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain
# People, ibm.com
dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
# Group, ibm.com
dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
# ldapuser, Group, ibm.com
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
gidNumber: 500
# ldapuser, People, ibm.com
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: test2
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
回页?/b> 用来讄客户机的 Red Hat Enterprise Linux release 4 Update 1 包包括:
- nss_ldap-226-6Q包括两?LDAP 讉K客户机:nss_ldap ?pam_ldap
- nss_ldap 是一l?C 库扩展,它允?LDAP 目录服务器用作一个用户和l信息的L
- pam_ldap 是一?Linux-PAM 模块Q它支持w䆾验证功能
LDAP w䆾验证要想正确地工作,需要配|两个服务:pȝ命名服务和n份验证服务?/p>
pȝ命名服务QNSSQ需要配|ؓ使用 LDAP 来解析诸如用户和l帐号之cȝ资源。例如,在运行命?
ls -l
Ӟ如果某个文g inode l出文g的所有者是 “user 501”,那么命名服务需要将 “uid 501?解析成用户名Qƈ?ls
命o输出l果中输出。通常来说Q这是通过查找 /etc/passwd 文g中的所有用户帐号实现的。由于用L在都存储?LDAP 目录中,因此pȝ需要配|成同时?passwd 文g?LDAP 目录中的帐号q行解析。这U功能是通过 /usr/lib/libnss_ldap.so 库提供的?/p>w䆾验证服务是实际向 LDAP 验证用户w䆾的服务。可插入w䆾验证模块QPAMQ提供了本地 Linux w䆾验证服务。下面我们将配置 PAM 先对本地?/etc/passwd 文g查用户帐P然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来n份验证重定向?LDAP 目录上?lib/security/pam_ldap.so PAM 模块提供?LDAP w䆾验证功能?/p>
w䆾验证本n是由 PAM E序执行的,它从w䆾验证候选机制中获取用户名,其l定?OpenLDAP 服务器上Q检索与q个 uid 条目Q用户名条目Q相关的 DNQ从w䆾验证候选机制中获取密码Q然后用这?DN 和密码试囑ְ其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说q个用户已经成功通过?pam_ldap.so 提供的n份验证测试。根?PAM 的配|不同,在用L到命令行提示W之前可能会执行其他试?/p>
我们可以采用两种Ҏ来配|?LDAP 客户机。一U快速而简单的Ҏ是运? /usr/sbin/authconfigQƈ在两个屏q中输入信息。另外一U方法是通过~辑客户?LDAP 配置文g /etc/ldap.confQ然后修?/etc/nsswitch.conf?etc/sysconfig/authconfig ? /etc/pam.d/system-auth。首先让我们来看一下如何运?authconfig?/p>
如图 3 所C行选择Q然后点?Next?/p>
?3. 执行 authconfig 命o的第一个页?/b>在如?4 所C的W二个屏q中输入对应的信息,然后点击 OK?/p>
?4. 执行 authconfig 命o的第二个面要手工配|?OpenLDAP 客户机,请遵循下面的步骤?/p>
用来跟踪特定w䆾验证机制是否已经启用的文件是 /etc/sysconfig/。我们可以希望以下条目的值都?“yes”:
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yesPAM ?NSS 模块使用的基本配|文件是 /etc/ldap.conf。host 选项指定 LDAP 服务器,base 选项指定q个目录使用?DNQ最初我们希望关闭加密功能:
host dhcp64-233.ibm.com
base dc=ibm,dc=com
ssl off要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap?d?/etc/nsswitch.conf 文g?passwd、shadow ?group 行中Q如下所C:
passwd: files ldap
shadow: files ldap
group: files ldap要让 PAM w䆾验证服务使用 OpenLDAP 服务器,请将 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在对应的标准 pam_unix.so 条目之后。尽其他设|也可以实现相同的结果,但是我用下面的文g讄Q?/p>
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so
account required /lib/security/$ISA/pam_unix.so broken_shadow
account sufficient /lib/security/$ISA/pam_localuser.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid %lt; 100 quiet
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
account required /lib/security/$ISA/pam_permit.so
password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_ldap.so use_authtok
password required /lib/security/$ISA/pam_deny.so
session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session optional /lib/security/$ISA/pam_ldap.so现在Q用户帐号信息可以从客户机系l中删除q从 LDAP 目录中进行获取了。当用户试图d客户机系l时QPAM w䆾验证服务׃从用户那里获取用户名Q在我们的例子中?
ldapuser
。PAM 会从 LDAP 服务器中索识别名QDNQ条?.dn: uid=ldapuser, ou=People, dc=ibm, dc=com.
。PAM 然后会从用户那里获取密码。然?PAM 试图使用q个 DN 和密码与 LDAP 服务器进行绑定。DN 和密码都以正文文本的格式发送给 LDAP 服务器。在对密码进行散列操作之后,如果服务器可以让用户dQ就会向 PAM 报告说已l成功进行了l定。成功绑定可以完全满?PAM ? pam_ldap 模块汇报成功的标准,如果所有其?PAM 标准都已l满了Q那么就允许用户d到系l中?/p>?LDAP 服务器对w䆾验证q行处理Ӟ需要解军_外两个问题才能满x供可靠安全的w䆾验证的目标。现在,M客户机系l不能成功地? LDAP 服务器进行通信都会L用户d客户机系l。在下一节中我们看到如何消除这U单Ҏ障,q将昄客户机如何从备䆾服务器上讉K LDAP 目录。由于用户密码是在网l上以正文文本格式传输的Q因此这q不能满_全n份验证的需求?a >配置 TLS 安全?/a> 解册个问题?/p>
回页?/b> Z防止出现客户机由?LDAP 服务器的问题而不能登录的情况Q我们需要采用复制技术来实现可靠性目标。复制是通过 OpenLDAP 复制q程 slurpd 提供的,它会周期性地唤醒Qƈ查主服务器上的日志文Ӟ从而确定是否有M更新。这些更新然后会传播C服务器上。读h可以׃Q何一个服务器q行? 析,而更新请求则只能׃服务器进行解析。客h需要负责在推荐地址上重试更新操作?/p>
要配|复Ӟ需要停?OpenLDAP 服务器的 slapd 守护q程Q?/p>
清单 10. 停止服务
# service ldap stop以下内Ҏ加到服务器的 /etc/openldap/slapd.conf 文g中,从而启用对C服务器的复制?code>replogfile 行的内容指定c?LDIF 变化应该写入的文件?code>replica 原语定义了变化应该传播到的主机:
#Replicas of this database
replogfile /var/lib/ldap/replog
replica host=dhcp64-253.ibm.com:389
binddn="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple在运行从 OpenLDAP 服务器的pȝ上,请遵?配置 LDAP 服务?/a> 一节给出的步骤。然后通过信息导出到一?ldif 文g中ƈ其dC服务器数据库上,从而将数据库从L务器拯到复制服务器上?/p>
在主服务器上Q?/p>
清单 11. 数据导出到 LDIF 文g?/b>
# ldapsearch -x > database.ldif在复制服务器上:
清单 12. 数据添加到从服务器数据库中
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f database.ldif以下内Ҏ加到复制服务器的 /etc/openldap/slapd.conf 文g中?code>updatedn 指定了在更新从目录时?slurpd 守护q程使用?DN?code>updateref 指定的是ȝ录服务器。当一?LDAP 客户求从服务器进行更新时Q从服务器就客h重定向到q个L务器上?/p>
updatedn "cn=Manager,dc=ibm,dc=com"
updateref ldap://dhcp64-233.ibm.com:389/启动复制 OpenLDAP 服务器,当它q行之后Q再启动?OpenLDAP 服务器。在L务器上,slapd ?slurpd 都会启动?/p>
现在Q可以让 OpenLDAP 客户机除了主服务器之外还可以使用复制服务器,q可以通过q行 authconfig q将复制L名添加到W二个屏q中?Server 行中实现Q也可以通过?/etc/ldap.conf 中修?host 实现Q?/p>
host dhcp64-253.ibm.com dhcp64-233.ibm.com
Z认复制可以正常工作Q需要研I一下在更新
gecos
属性时到底发生了什么。复制日志用了?LDIF cM的格式。在d replogfile 之后Qslurpd 会将q个条目拯到自q重做日志中。实际的变化都以 LDIF 格式保存在主 LDAP 服务器上 /var/lib/ldap/replica/ 中的 slurpd.replog 文g中?/p>使用文g user_mod 中的变化Q客hE序 ldapmodify 应用q些变化Q?/p>
清单 13. 应用 user_mod 的变?/b>
# cat user_mod
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
changetype: modify
replace: gecos
gecos: test2
# tail -f /var/lib/ldap/replog &
# ldapmodify -x -r -f /home/ldapuser/user_mod -D'cn=Manager,dc=ibm,dc=com' -W
Enter LDAP Password:
modifying entry "uid=ldapuser,ou=People,dc=ibm,dc=com"
replica: dhcp64-253.ibm.com:389
time: 1130111686
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
changetype: modify
replace: gecos
gecos: test2
-
replace: entryCSN
entryCSN: 20051023235446Z#000001#00#000000
-
replace: modifiersName
modifiersName: cn=Manager,dc=ibm,dc=com
-
replace: modifyTimestamp
modifyTimestamp: 20051023235446Z
-
回页?/b> LDAP 是以明文的格式通过|络来发送所有信息的Q包括密码。我们将采用 TLS 所提供的加密机ӞSSL 的后l者)来解册个问题。在传输层,数据使用 TLS 协议q行加密和封装,然后通过|络q行传输。用来配|加密的工具都是?OpenSSL 包提供的?/p>
虽然加密是一个复杂的主题Q但是要使用 OpenSSL 包,我们依然需要简要介l一?TLS 是如何工作的。数据块使用一个对U密钥算法进行加密,它用一个密钥来实现Ҏ据的加密和解密。我们还有一个问题:如何防止出现以正文文本格式将密钥? LDAP 服务器发送到 LDAP 客户Z的情c我们用公钥算法来解决q个问题Q其中客h可以使用一个自p取的公钥对自q密钥q行加密Q而只有服务器才可以对q个密钥q行解密?/p>
公钥是作书的一部分来创建和分发的,其中包含了一些支持信息,例如 ID、过期日期、提供这个证书的 LDAP 服务器的完整域名QFQDNQ。在 LDAP 客户Z用证书进行加密之前,它会验证自己正在与之q行交谈的服务器拥有q个证书Q这是通过加密一个挑战ƈ验证服务器可以对其进行解密实现的?/p>
要验证发行这个证书的服务器是一个已l批准过?LDAP 服务器,客户配置为只接受本地证书机构QCAQ所{v的证书。它使用 CA 所生成的证书中的公钥,q个公钥保存到客h中以验证q个 LDAP 所产生的证书是有效的?/p>
在这个例子中Q我们将自己?LDAP 服务器设|ؓ证书机构Qƈ创徏一个自{v的证书供 LDAP 客户机和服务器在加密信息中用?/p>
用来构徏 TLS 服务器的 Red Hat Enterprise Linux release 4 Update 1 包是Q?/p>
- openssl-0.9.7a-43.1Q包括一个证书管理工具和提供各种加密法和协议的׃n?/li>
要构书机构的工作环境q生成自q自签|证书,需要运?/usr/share/ssl/misc/CA shell 脚本Q这是一个对
openssl
命o的封装程序。私密性增强邮ӞPEMQ是一U用来对数据q行加密和编码的格式Q?/p>
清单 14. q行 CA shell 脚本
# cd /usr/share/ssl/misc
# ./CA -newca
CA certificate filename (or enter to create)
Making CA certificate ...
Generating a 1024 bit RSA private key
.........++++++
......++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated into
your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:Oregon
Locality Name (eg, city) [Newbury]:Beaverton
Organization Name (eg, company) [My Company Ltd]:IBM
Organizational Unit Name (eg, section) []:its
Common Name (eg, your name or your server's hostname) []:dhcp64-233.ibm.com
Email Address []:root@dhcp64-233.ibm.com接下来,要生成由证书机构q行{v的服务器证书。其余的步骤只会对主 LDAP 服务器执行一ơ,此时指定的是
CN=dhcp64-233.ibm.com
Q然后对从服务器执行一ơ,此时指定的是CN=dhcp64-253.ibm.com
。还要?nodes
选项Q这样就不用在每ơ启?OpenLDAP 服务器守护进E?slapd 旉需要输入密码了。签|后的公钥被嵌入到证书请?slapd-req.pem 中,与之匚w的私钥嵌入在 slapd-key.pem 中:
清单 15. 生成服务器证?/b>
# openssl req -new -nodes -subj
'/CN=dhcp64-233.ibm.com/O=IBM/C=US/ST=Oregon/L=Beaverton'
-keyout slapd-key.pem -out slapd-req.pem -days 365
Generating a 1024 bit RSA private key
...............++++++
.....................................++++++
writing new private key to 'slapd-key.pem'
-----使用在第一个步骤中创徏?CA 证书对这个证书进行签|Ԍ
清单 16. 对证书进行签|?/b>
# openssl ca -out slapd-cert.pem -infiles slapd-req.pem
Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 25 02:50:05 2005 GMT
Not After : Oct 25 02:50:05 2006 GMT
Subject:
countryName = US
stateOrProvinceName = Oregon
organizationName = IBM
commonName = dhcp64-233.ibm.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
11:A2:FB:59:42:A4:B3:26:73:1D:6D:F5:4D:2F:80:F0:FA:10:38:F5
X509v3 Authority Key Identifier:
keyid:F7:6A:25:F5:76:BE:20:E7:8D:0F:51:EF:D8:86:7B:AF:2C:74:2F:80
DirName:/C=US/ST=Oregon/L=Beaverton/O=IBM/OU=its/CN=dhcp64-233.ibm.com
/emailAddress=root@dhcp64-233.ibm.com
serial:00
Certificate is to be certified until Oct 25 02:50:05 2006 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated下一个步骤将所有需要的证书拯?slapd 可以扑ֈ的地斏V另外,q要Ҏ个文件强刉用正的权限Q?/p>
清单 17. 拯证书q强制设|权?/b>
# cp -p slapd-key.pem /etc/openldap/slapdkey.pem
# cp -p slapd-cert.pem /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdcert.pem
# chmod 644 /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdkey.pem
# chmod 400 /etc/openldap/slapdkey.pem
# mkdir /etc/openldap/cacerts/
# cp /usr/share/ssl/misc/demoCA/cacert.pem /etc/openldap/cacerts/cacert.pem
# chown ldap:ldap /etc/openldap/cacerts cacert.pem
# chmod 644 /etc/openldap/cacerts cacert.pem?OpenLDAP 服务器上Q将以下内容d?/etc/openldap/slapd.conf 文g?
global
D下面?code>TLSCertificateFile ?TLSCertificateKeyFile
指定了证书文件和U钥文g的\径?code>TLSCipherSuite 指定了一?OpenSSL 密码的列表,slapd 在与 TLS 协商建立q接时可以从中按照降序顺序依ơ选择?code>HIGH 的意思是 “所有密钥的长度都大?128 位”;MEDIUM
表示 “所有密钥的长度都等?128 位”;+SSLv2
表示 “不密钥强度如何,所有密码都是以 SSL 协议版本 2 的Ş式指定的”?/p>
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem以下内Ҏ加到 LDAP 服务器的W二个配|文?/etc/openldap/ldap.conf 中:
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allowZ允许?OpenLDAP 客户Z使用安全q接Q需要将以下内容d?/etc/openldap/ldap.conf 文g中:
ssl start_tls
tls_checkpeer yes
tls_cacertfile /etc/openldap/cacerts/cacert.pem
回页?/b> 按照本文l出的提C,我们现在已经使用轻量U目录访问协议(LDAPQ构Z一个集中的w䆾验证pȝ。我们最初是通过配置 LDAP 服务器来响应?“dc=ibm,dc=com?的基本请求开始入手的。我们用了一l?Perl 脚本来将用户帐号信息q移?LDAP 目录中。我们对 Linux 用户帐号服务、PAM ?NSS 服务q行了修改,从而可以从 LDAP 服务器中索用户信息。还讄了一? LDAP 服务器副本作为备用服务器来响应客h的请求。然后,使用 TLS 协议?LDAP 客户机和服务器之间对通信q行安全加密。恭喜!
Z参考方便,下面l出了本文中使用的配|文件的完整清单?/p>
清单 18. 本文例子中用的服务?/etc/openldap/slapd.conf 文g
#
# See slapd.conf (5) for details on configuration options.
#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
loglevel 256
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
# The next three lines allow use of TLS for encrypting connections.
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem
# access control policy:
# Restrict password access to change by owner and authentication.
# Allow read access by everyone to all other attributes.
access to attrs=shadowLastChange,userPassword
by self write
by * auth
access to *
by * read
#######################################################################
# database definition
#######################################################################
database bdb
suffix "dc=ibm,dc=com"
rootdn "cn=Manager,dc=ibm,dc=com"
rootpw {MD5}ijFYNcSNctBYg
directory /var/lib/ldap
# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
#Replicas of this database
replica host=dhcp64-253.ibm.com:389
binddn="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple
replogfile /var/lib/ldap/replog
清单 19. 本文例子中用的服务?/etc/openldap/ldap.conf 文g
#
# LDAP Defaults
#
# See ldap.conf(5) for details
HOST 127.0.0.1
BASE dc=ibm,dc=com
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow
清单 20. 本文例子中用的客户?/etc/ldap.conf 文g
a
# @(#)$Id: ldap.conf,v 1.34 2004/09/16 23:32:02 lukeh Exp $
#
# This is the configuration file for the LDAP nameservice
# switch library and the LDAP PAM module.
#
# PADL Software
# http://www.padl.com
#
# Your LDAP server.
# Multiple hosts may be specified, each separated by a
# space.
host dhcp64-233.ibm.com dhcp64-233.ibm.com
# The distinguished name of the search base.
base dc=ibm,dc=com
# OpenLDAP SSL mechanism, start_tls mechanism uses the normal LDAP port 389
ssl start_tls
#Require and verify server certificate
tls_checkpeer yes
# CA certificates for server certificate verification
tls_cacertfile /etc/openldap/cacerts/cacert.pem
pam_password md5
回页?/b>
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 ?br />
- OpenLDAP 主页 ?OpenLDAP 目的主c其中包含了有关如何配置 OpenLDAP 的丰富信息,以及来的\U图和版本信息。请保阅读 OpenLDAP Software 2.3 Administrator's Guide?
- ?OpenSSL Project 中,可以扑ֈ有关 SSL ?TLS 的信息?
- ?LDAP Linux HOWTO 中,我们可以扑ֈ有关?Linux 机器上安装、配|、运行和l护 LDAPQLightweight Directory Access ProtocolQ服务器的详l信息。请?LDAP Implementation HOWTO 中阅M?pam_ldap ?nss_ldap q行 LDAP w䆾验证的讨论?
- PADL 主页 提供?Perl q移脚本 nss_ldap ?pam_ldap 以及很多其他有用?LDAP 工具?
- ?developerWorks Linux 专区 中可以找Cؓ Linux 开发h员准备的更多资源?
- 随时x developerWorks 技术活动和|络q播?
获得产品和技?/b>
- 索取免费?SEK for LinuxQ这有两?DVDQ包括最新的 IBM for Linux 的试用版软gQ包?DB2]、Lotus]、Rational]、Tivoli] ?WebSphere]?
- 在您的下一个开发项目中采用 IBM 试用版Y?/a>Q这可以?developerWorks 上直接下载?
讨论
- OpenLDAP 邮g列表 是讨?OpenLDAP 的主要论坛?
- 通过参与 developerWorks blogs 加入 developerWorks C?
回页?/b>
Mike O'Reilly ?IBM Linux ?VMware ESX 产品支持组的一员,他ؓ Linux 产品提供支持已经?5 q的旉了。另外,他支?VMware ?/p>
]]>
CODE: iptables -s 200.200.200.1 |
CODE: iptables -s 200.200.200.1 -j DROP |
CODE: iptables -A INPUT -s 200.200.200.1 -j DROP |
CODE: iptables -A OUTPUT -d 200.200.200.1 -j DROP |
CODE: iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP |
CODE: iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP |
CODE: iptables -A INPUT -i ppp0 -p tcp --syn -j DROP |
CODE: iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP |
CODE: iptables -P FORWARD ACCEPT |
1. 配置RedHat AS 3
操作pȝ版本Q?
Red Hat Enterprise Linux AS release 3 (Taroon)
Kernel 2.4.21-4.EL on an i686
按照常规来安装操作系l?记得要安装开发工?gcc{必要工?.
1.1 查必要的g信息
查完如上各项之后, 应该修改核心参数.执行如下命o:
查内?/font>
最?/font>
查命令参?/font>
物理内存
512M
# grep MemTotal /proc/meminfo
交换I间
1.0 GB或?倍内存大?/font>
# grep SwapTotal /proc/meminfo
/tmp I间
400 MB
# df -k /tmp
软g所需I间
2.5 GB
# df -k (I间大好,如果是正式系l?应该q行详尽的规?
数据库文?/font>
1.2 GB
# df -k (I间大好,如果是正式系l?应该q行详尽的规?
#vi /etc/sysctl.conf
#注释:
#表示使用root用户操作,$表示使用oracle 用户q行操作.提示W后面的蓝色部分表示需要输入的命oQ以下同Q?
在该文g末尾加入如下内容:
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
~辑完之?保存,执行 # /sbin/sysctl -p 命o操作来我们所做的变更生效.
?上面kernel.shmmax/kernel.sem{是典型的核心参数配|?您可能需要根据您的实际环境进行适当的变?
关于q些核心参数的说明在Oracle?Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很详l的说明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm )
然后,应该查一下上面的操作是否正确:
# /sbin/sysctl -a | grep sem
# /sbin/sysctl -a | grep shm
# /sbin/sysctl -a | grep file-max
# /sbin/sysctl -a | grep ip_local_port_range
为Oracle用户讑֮Shell的限?br />一般来_Z性能上的考虑,q需要需要进行如下的讑֮Q以便改qOracle用户的有?nofile(可打开的文件描q符的最大数)和nproc(单个用户可用的最大进E数?
# vi /etc/security/limits.conf
# d如下的行
* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536
d如下的行?etc/pam.d/login 文gQ?
session required /lib/security/pam_limits.so
~辑 /etc/profile 文g,d如下部分Q?
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
之后Q执?font color="#0000ff">$ ulimit 验证一?
1.2 查ƈ安装相关补丁
在这个版本的RHEL上安装Oracle,必须要有几个软g? 认以下 rpm包都已经安装:
make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-db-4.0.14.5
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
# rpm -qa | grep compat
# 在机器上输出如下:
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-glibc-7.x-2.2.4.32.5
compat-db-4.0.14-5
compat-gcc-7.3-2.96.122
# rpm -qa | grep openmotif
openmotif-devel-2.2.2-16
openmotif-2.2.2-16
# rpm -qa | grep setarch
setarch-1.3-1
上面昄的内Ҏ在笔者已l安装了具体的RPM包之后的l果.一般情况下,你的pȝ上的输出l果和这个不?如果个别包没有安?把系l安装光盘mount?扑ֈ具体的Y件包(大多数在W三张光盘上),然后利用如下的命令来安装相应的包:
# rpm -ivh *.rpm
要额外注意的?q些软g包之间是有依赖性的,先后的顺序要扑֥.否则会报告不能安装的错误. 此外Q最好验证一?gcc和glibc的版?要求是gcc-3.2.3-2 或者更?:
#gcc -v
#rpm -q glibc
1.3 创徏用户和相关的l?/strong>
# /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -g oinstall -G dba oracle
如果只是试目的的话Q不创徏oinstalll也没什? 不过q是规范一Ҏ较好.如果oracle 用户和dbal等已经存在Q作适当的调整即?
1.4 查ƈ调整环境变量
d为oracle用户
# su - oracle
$ cd
$ vi .bash_profile
#d如下内容,你的具体值应该不会和q个完全相同.
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/dbse
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8
然后执行
$ source .bash_profile
使环境变量生? /oracle {目录应该徏立好q做合适的授权.
2. 安装Orale10g
mount安装?׃10g无法以root安装Q以前面建的oracle用户d.执行:
$ ./runInstaller
按照提示安装卛_Q最后还需要以rootq行两个脚本?/font>
3. 配置TNS参数
?/oracle/product/dbse/network/admin/ 目录下有 listener.ora ?tnsnames.ora 两个文gQ设|如下:
#listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /oracle/product/dbse)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
)
)
#tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
其中SERVICE_NAME与SID_NAME一定要?bash_profile中的ORACLE_SID怸_否则无法启动
4. 启动Oracle
以oracle用户d
4.1 启动TNS监听?/strong>
$ lsnrctl start
出现如下昄Q表C监听服务成功开?br />LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-FEB-2006 10:24:03
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /oracle/product/dbse/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /oracle/product/dbse/network/admin/listener.ora
Log messages written to /oracle/product/dbse/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 22-FEB-2006 10:24:03
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/product/dbse/network/admin/listener.ora
Listener Log File /oracle/product/dbse/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
4.2启动数据?/strong>
9i 之后已经没有 svrmgrl 了,所有的理工作都通过 sqlplus 来完成:
$ sqlplus /nolog
SQL> connect system/change_on_install as sysdba
SQL> startup
出现如下昄Q表COracle已经成功启动
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 88082024 bytes
Database Buffers 188743680 bytes
Redo Buffers 7168000 bytes
Database mounted.
Database opened.
4.3 自动启动与关?/strong>
~辑 /etc/oratab Q把所有的 instance 的重启动标志讄?'Y'Q如:
orcl:/oracle/product/dbse:Y
做一个启动脚?/etc/init.d/dbora Q如下所C?
#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 20 80
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.
ORA_HOME=/oracle/product/dbse
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
echo "Oracle startup: cannot start"
exit
fi
case "$1" in
'start')
# Start the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
;;
'stop')
# Stop the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
;;
'restart')
$0 stop
$0 start
;;
esac
赋予执行权限
chmod 750 /etc/init.d/dbora
作成以下链接:
ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora
执行以下命o:
chkconfig --level 345 dbora on
q样OK了。下ơ开x的时候,Oracle也会随之启动/停止?/font>
参考信?/font>
http://www.dbanotes.net