Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1422555
  • 博文数量: 122
  • 博客积分: 340
  • 博客等级: 一等列兵
  • 技术积分: 2967
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 11:50
个人简介

说点什么呢

文章分类

全部博文(122)

文章存档

2018年(2)

2017年(1)

2015年(2)

2014年(30)

2013年(81)

2011年(5)

2009年(1)

分类: LINUX

2014-01-07 13:24:53

关于linux系统优化与安全

(整理时间:2009-05-19)

一、 关于磁盘分区

1、 应将root swap, /var , /usr, /home分别挂接在不同的单独分区,这样提高磁盘的读写效率;

2、 因为当前大多数的磁盘外圈磁道的扇区数比内圈磁道的扇区数要多,所以外圈磁道的读写速度要比内圈的快。而分区数较小的分区通常被分配在外圈,例如:/dev/hda1/hda3外面。所以应该将分区号较小的分区挂接在那些经常访问的文件系统上。挂接文件系统的顺序建议是:

a) 第一个分区挂接swap,即交换分区,因为交换分区访问的频率一般是最高的;

b) /var挂接在第二个分区上,因为日志进程需要经常向/var/log下写东西;

c) 接下来应该是/usr分区,因为绝大部分系统命令都放在这个文件系统下;

d) 根分区和/home分区放在最后;

3、 如果系统有多块硬盘,应考虑以下事项:

a) 如果磁盘的访问速度不一样,应将经常访问的文件系统挂接在较快的硬盘上;

b) 如果几块盘的访问速度是一样的话,那么应将相近的访问频率的文件系统挂接在不同的磁盘上,如:如果将/var挂接在一块硬盘上,那么/usr就挂接在另一块硬盘上;

c) 如果几块硬盘的访问速度一样,可以考虑采用RAID

d) 应尽量将各块盘设置成各自通道中的主硬盘,因为这样可以最大化的使用总线的吞吐量。如果是在现有的系统上修改,需要注意修改相关的配置文件,如/etc/fstab

二、 关于I/O调度器

2.4内核只有一种IO调度器,即为robust

2.6内核共有四种 IO 调度器,分别是:

  (关于I/O调度器

1Deadline schedulerDeadline scheduler 用 deadline 算法保证对于既定的 IO 请求以最小的延迟时间,从这一点理解,对于 DSS(决策支持系统) 应用应该会是很适合的。

2Anticipatory scheduler 曾经一度是 Linux 2.6 Kernel 的 IO scheduler Anticipatory 的中文含义是"预料的预想的", 这个词的确揭示了这个算法的特点,简单的说,有个 IO 发生的时候,如果又有进程请求 IO 操作,则将产生一个默认的 毫秒猜测时间,猜测下一个 进程请求 IO 是要干什么的。这对于随即读取会造成比较大的延时,对数据库应用很糟糕,而对于 Web Server 等则会表现的不错。这个算法也可以简单理解为面向低速磁盘的,因为那个"猜测"实际上的目的是为了减少磁头移动时间。

3Completely Fair Queuing虽然这世界上没有完全公平的事情,但是并不妨碍开源爱好者们设计一个完全公平的 IO 调度算法。Completely Fair Queuing cfq, 完全公平队列在 2.6.18 取代了 Anticipatory scheduler 成为 Linux Kernel 默认的 IO scheduler cfq 对每个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理。也就是对每一个 IO 请求都是公平的。这使得 cfq 很适合离散读的应用(eg: OLTP DB)。我所知道的企业级 Linux 发行版中,SuSE Linux 好像是最先默认用 cfq .(经检查在redhat 2.6.9-5内核中就默认使用这种算法)

4NOOPNoop 对于 IO 不那么操心,对所有的 IO请求都用 FIFO 队列形式处理,默认认为 IO 不会存在性能问题。这也使得 CPU 也不用那么操心。当然,对于复杂一点的应用类型,使用这个调度器,用户自己就会非常操心。那么如果跑数据库应用,那个更好一些呢我们看一文中的测试结果:

对于数据库应用, Anticipatory scheduler 的表现是最差的。Deadline 在 DSS 环境表现比 cfq 更好一点,而 cfq 综合来看表现更好一些。这也难怪 RHEL 4 默认的 IO 调度器设置为 cfq. 而 RHEL 4 比 RHEL 3,整体 IO 改进还是不小的。哪一种方式更好很难说,每一种方式都有特定的应用对它是最适合的。就像上面的 as 好像表现比较差,如果是 CPU 密集型的应用呢

     关于上述的四种调度算法,可以参看以下这篇文章:
      

   (查看系统当前所使用的调度器

1、在redhat 4 中可以使用以下命令查看系统当前所使用的调度器

  # dmesg |grep "io scheduler"

             Using cfq io scheduler

       2、据说在redhat 5中可以查看 /sys/block/{device}/queue/ scheduler可以看到,因为没有redhat 5环境,所以没有验证;

   (三)修改系统的I/O调度器

1、在redhat 4的版本中可以通过修改启动时的内核参数来达到改变调度器的目的,

具体的是修改/boot/grub/grub.conf 文件,添加上elevator=deadline即可。如:

   title Red Hat Enterprise Linux AS (2.6.9-5.EL)

           root (hd0,0)

           kernel /vmlinuz-2.6.9-5.EL ro root=/dev/md3 elevator=deadline rhgb quiet

           initrd /initrd-2.6.9-5.EL.img

        2、而redhat 5据说可以支持动态的修改,具体的方法就是

       echo anticipatory >/sys/block/{device}/queue/scheduler因为没有redhat 5环境,所以没有验证;

三、 关于BSDSystem V 初始化

(一) Linux两种初始化风格
    当前不同的Linux发行版本有两种初始化风格:BSD风格和System V风格。RedHat 和 Debian 使用System V初始化风格,而Slackware 使用BSD风格。
    针对linux 的文件系统层次标准2.0版规定支持System V 和 BSD风格的启动。除了特别说明以后,rc脚本都是存放在/etc下面。
    在系统初始化过程中,BSDSystem V风格的最大不同是init脚本。在BSD类型中,所有的进程都是通过几个脚本直接启动的。例如Slackware中的init 脚本就是运行系统脚本(/etc/rc.d/rc.S)来准备系统的。rc.S 文件设置虚拟内存,挂载必要有文件系统,清除某些日志目录,初始化即插即用硬件等。
    而其它的Linux发行版使用System  类型。

(二)  初始化表文件/etc/inittab 
     系统初始化表文件(/etc/inittab)用于指定系统在启动过程中init进程如果的初始化和启动其它进程。在这个文件里以#开头的行为注释行,非注释行的格式如下:

id:runlevel:action:process 其中:

id: 为项标识标,用于唯一的标识/etc/inittab的每一项。最多为4个字符(在老的libc5 版本小于5.2.18a.out动态库的系统中,限制为两个字符);

runlevel:指定运行的级别,这个字段可以为空;

action:所采取的动作。绝大多数的动作为respawn,当然也可以是下列动作之一:

     once, sysinit, boot, bootwait, wait, off, ondemand, initdefault, powerwait, powerfail, powerokwait, ctrlaltdel, or kbrequest
   动作的含义:

   once:当指定运行级别之后,进程将被执行一次;

   sysinit:系统初始化。进程将在系统启动的时候运行,进程将在任何启动或者启动等待条目之前运行。忽略运行级别。

   boot: 在系统启动期间,进程将被执行,忽略执行级别;

   bootwait:进程在系统启动期间执行,且init进程等待该进程执行结束;

   wait: 启动进程并等待其结束,然后再处理该文件中的下一项;

   off:如果相应的进程正在运行,那么就发出一个警告信息,等待20秒钟后,再通过杀死信号强行终止该进程。如果相应的进程不存在,那就忽略这一项;

   ondemand“respawn”的功能完全相同,但只用于运行级为abc的登记项。而abc为系统的虚拟运行级别。系统中不真正存在这个运行级别,这个级别只是让init进行仅处理/etc/inittab文件中包含的abc运行级别设置的那些记录项;

   initdefault指定系统的默认运行级。系统启动时,init将首先查找该登记项。如果存在init将据此决定系统最初要进入的运行级。如果该字段为空,那么将其解释为“0123456”,并以“6”作为默认运行级。如果不存在该登记项,那么init将要求用户在系统启动时指定一个最初的运行级。

   powerwait只在init接收到电源失败信号时执行相应的进程,并在继续对/etc/inittab文件进行任何处理前等待该进程结束

     powerfail只在init接收到电源失败信号时执行相应的进程,但不等待该进程结束。

     powerokwait:当系统接收到电源恢复的时候执行对应的进程; 

     ctrlaltdel当系统接收到有用户从终端同时按下CTRL+ALT+DEL键时执行的进程;

     kbrequest当指定的组合键在终端被按下的时候,执行指定的进程。

     respawn如果相应的进程还不存在,那么init就启动该进程,同时不等待该进程的结束就继续扫描/etc/inittab文件;当该进程死亡时,init将重新启动该进程。如果相应的进程已经存在,那么init将忽略该登记项并继续扫描/etc/inittab文件。

四、 系统性能监视工具

(一) uptime 命令

输出:

17:11:09 up 20 days, 53 min,  2 users,  load average: 0.00, 0.00, 0.00

        含义:当前时间,系统最近连续运行的天数,多少个用户连到系统,平均负载,分别是:1分钟,5分钟,15分钟的统计数据。

       注意:负载数/系统CPU个数< 1的话,说明系统不是满载

(二)  vmstat 命令

功能:该命令是一个实时的性能监视工具。它可以帮助找出系统中不寻常活动,如高页错误或过多的内容交换等。可以指定一个参数来设置显示的频率,输出如下:

procs -----------memory----------        ---swap--     -----io----   --system--  ----cpu----

 r  b   swpd   free   buff  cache      si   so    bi    bo   in    cs  us sy id wa

 0  0    160  37032 324456 1412864    0    0     0     5 1116   619  0  0 100  0

 0  0    160  37032 324456 1412864    0    0     0    29 1084   588  0  0 99  0

 0  0    160  37096 324456 1412864    0    0     0     5 1078   592  0  0 100  0

 0  0    160  37096 324456 1412864    0    0     0    19 1067   583  0  0 100  0

 0  0    160  37096 324456 1412864    0    0     0    20 1112   649  0  0 100  0

 0  0    160  37160 324456 1412864    0    0     0     0 1060   589  0  0 100  0

各字段的含义:

procs: 报告时系统正在运行的进程数(r部分)和阻塞的进程数(b部分)。这些数字可以与期望

的值进行核对。如果与期望的值不一致,则应该检查内核和应用的参数,系统调度器,I/O调度器以及分布在可用处理器的进程的情况,等等。

memory:报告内存的如下数据:正在换出数(swpd),空闲内存(free) I/O数据结构缓冲器

(buff buffer  cache for I/O data structure),从磁盘中读出文件时缓冲(chache) 以上单位是KBswpd 的值反映出kswapd进程的活动情况。

swap 返回的是从磁盘换进到内存(si和从内存换出到磁盘(so)字节数。单位是KB每秒。

io: 部分返回的是从磁盘各块设备中读出(bi)和写入(bo)的块数,单位是KB/S。当运行对I/O

要求高的应用时,应时常注意这两个字段的数据。

system 报告的是中断数(in)和每秒钟的内容交换数。

cpu: 报告的是在统计时间内,用户(us,系统(sy),空闲(id)以及等待I/O完成(wa)等所占

CPU总的时间的百分比。如果wa很大,那就应该检查I/O子系统,你可能需要决定是否增加I/O控制器和磁盘数,来减少I/O的等待时间。

五、 系统的性能监视

(一) 内存利用
/proc下的/proc/meminfo/proc/slabinfo 两个文件记录了系统的物理内存消耗情况。下面就是/proc/meminfo文件的内容:

/proc/meminfo/proc下最经常使用的一个文件之一,它显示了大量的关于系统内存使用情况的信息。

MemTotal:       515324 kB  :系统中的总的物理内存,单位是KB

MemFree:         23676 k  :系统中的空闲内存,单位是KB

Buffers:         56292 kB  :文件缓冲器所使用的物理内存数,单位是KB

Cached:         231464 kB :作为缓冲内存所使用的物理内存数,单位是KB

SwapCached:        176 kB作为缓冲内存所使用的交换分区数,单位是KB

Active:         260568 kB 页缓冲内存和缓冲器的总数,单位是KB。这是最

近被使用,而且一般还没有被收回作其它用途的内存。

Inactive:       107708 kB:空闲和可用的缓冲器和页缓冲内存的数量,单是KB。这些内存最近没有被使用而且可以被回收后再次使用。

HighTotal:           0 kB:高端内存的总数,单位是KB。这些内存不能直接被映射到内核空间中。HighTotal的值是基于内核的类型而改变的。

HighFree:            0 kB:高端内存的内闲部分。单位是KB。这些内存不能直接被映射到内核空间中。

LowTotal:       515324 kB:可以直接被映射到内核空间的内存总数,单位KB

LowToal的值基于内核的类型而改变。

LowFree:         23676 kB:可以直接被映射到内核空间的空闲内存,

SwapTotal:     1534072 kB:可用的交换分区总数。

SwapFree:      1533896 kB:空闲的交换分区大小

Dirty:              28 kB:等待被写回到磁盘上的内存空间数。

Writeback:           0 kB:正在被写回到磁盘的内存空间数;

Mapped:         112860 kB:映射到设备、文件和动态库的内存数;

Slab:            67444 kB:内核用户缓冲数据结构的内存数;

Committed_AS:   353724 kB:估计完成负载所使用的内存总数,这个值表示的是

处理事务所需的最大内存,同时包括交换分区。

PageTables:       2512 kB:用于最低页表情况下的内存总数。

VmallocTotal:   499704 kB:分配给虚拟地址空间的总的内存数

VmallocUsed:      5704 kB:已经使用的虚拟地址空间的内存数

VmallocChunk:   493044 kB:虚拟地址空间中最大的内存地址块;

HugePages_Total:    10:系统中总的hugepage数,这个数只在X86Itanium,

AMD平台出现

HugePages_Free:     10:系统中可用的HugePage

Hugepagesize:     4096 kB:每个hugepages单元的大小。默认情况下单CPU的情

况这个值是4096,而在多CPU的情况下,这个是值是2048

上面这些信息许多会被free topps 命令所使用。实际上,free命令的输出的内容和结果都和/proc/meminfo文件里的很相似。但是直接查看/proc/meminfo文件其实更祥细。

为了更祥细的了解内存的消耗情况,可以查看/proc/slabinfo文件。这个文件详细记录了内存的消耗情况。也可以用/usr/bin/slabtop命令来查看。

如果/proc/meminfo里的LowFreeHighFree的值偏小,或者比平时小,则可能表明系统中的请求较多或者说比平时更消耗系统内存,同时也意味着性能将会比平时低。

(二) I/O利用

iostat 命令能够监视物理磁盘的活动情况及其传输入速率等。以下是iostat命令的输入结果:

avg-cpu:  %user   %nice    %sys %iowait   %idle

           0.00    0.00    0.33    0.33   99.34

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

hda               1.32         0.00        13.25          0         40

hdd               1.32         0.00        13.25          0         40

md0               0.00         0.00         0.00          0          0

md1               0.00         0.00         0.00          0          0

md4               0.00         0.00         0.00          0          0

md3               0.99         0.00         7.95          0         24

md2               0.00         0.00         0.00          0          0

需要注意的有:

1、 CPU部分与top命令的输出是类似的;

2、 磁盘部分的tps字段表示平均的请求数;

3、 其它字段的含义很好理解,这里不作解释;

4、 上述的速率和大小均为块数,而不是字节数;

5、 如果执行iostat命令时不带间隔参数,则统计出来的数据是指从系统最近一次启动后到执行命令时的平均数;如果带间隔参数,则第一次输出是每时系统最近一次启动后到执行命令时的平均数,之后的输出均表示间隔时间内的变化量;

6、 k选项,则输出的大小的单位是KB,带-x选项可以获得平均等待时间和平均服务时间;带-p选项输出每个分区的统计信息;

7、 上面的输出信息可以帮助我们找出磁盘I/O的瓶劲在哪里;

8、 该命令是包括在sysstat软件包里;

sar: 包括在sysstat软件包里。这个命令可以收集和输出包括:I/O操作,CPU利用,内容交换和中断速率,而换出和换进速率以及共享内存,缓冲器和网络的使用情况。

六、 系统安全概要

(一) BIOS安全,设定引导口令

1. 设定BIOS口令,防止可以接触到机器的人修改BIOS设置并重启机器;

2. 修改BIOS设置,禁止从软盘或光盘启动系统,当需要时可以修改过来;

(二) 制定系统安全策略

制定系统安全策略是很重要的,只有制定了合理的安全策略才能知道应该保护哪些数据,防止哪些人。制定安全策略时一般性指导原则有:

1. 怎么定义保密的和敏感的信息;

2. 确定要重点防范的人群;

3. 确定系统是否有必要远程访问;

4. 系统中有保密的或敏感的信息吗?

5. 如果信息被泄露会造成如何的后果;

6. 口令和加密能够提供足够的保护吗?

7. 有必要访问Internet吗?

8. Internet 的访问量;

9. 如果发现系统被入侵,应该如何处理?

(三) 口令的复杂度及策略设置

1. 口令至少要有6个字符,且最好包含一个以上的数字或特殊字符;

2. 口令不能太简单,如姓名、电话号码、生日、职业等;

3. 口令必须要有有效期,在一段时间后要更换口令;

4. 在发现有人试图猜口令的时候,一定要记住修改口令;

5. /etc/login.defs文件里有关于口令复杂度的设置;

(四) 禁止控制台程序及控制台访问

1、 为了提高系统的安全性,可以将/etc/security/console.apps下的部分文件删除掉,当删除掉了其下的某个文件,则其对应的命令在控制台下就不能执行。如为了防止用户随意的从控制台关闭、重启机器,可以将以下文件删除

rm –f /etc/security/console.apps/halt

rm –f /etc/security/console.apps/poweroff

rm –f /etc/security/console.apps/reboot

rm –f /etc/security/console.apps/shutdown 

2、 为了禁止所有的控制台访问,包括程序和文件,可以将/etc/pam.d目录下的所有文件中,给包含pam_console.so的行加上注释。以下脚本可以完成以上工作:

#/bin/sh

cd /etc/pam.d

for i in *; do

sed /[^#].*pam_console.so/s/^/#/ <$i >foo && mv foo $I

          done

(五) 关于xinetd

1. 什么是xintd

xintd(extended Internet services daemon)是替代 inetdInternet services daemon)的安全互联网服务进程,它比inetdtcp_wrappers更有效率。它的一些特性可以使它更适合于构建安全服务器,这些特性包括:基于源地址、目标地址和时间的访问控制,扩展日志以及可以指定服务侦听的网络接口。因为xinetd是用来替代inetd的,所以它也是一个超级服务器,它可以处理所有inetd所处理的事情,但是xinetdinetd却相互不兼容。实际上xinetdinetd可以相互和平共处的。

2xinetdinetd的异同

1) xinetd可以支持RPC服务,而inetd却不行。虽然,xinetd开发者建议不这么做;

2) 两者的配置文件不同;而且两者的配置文件不相互兼容的。Xinetd的配置文件包含更多的信息,以便能够处理更多的安全参数;

3)  xinetd如果在编译的时候加上--with-libwrap 选项就可以让xinetd支持libwrap,这个xinetd就可以使用hosts.deny|allow机制了(如果这样做,系统需要安装tcp_wrappers软件包)

3xinetd资源

1) 官网: 这里可以了解xinetd最新版本以及可以下载源代码,也可以找到技术文件;

2) 技术教程:http://web.archive.org/web/20040803085845/www.macsecurity.org/resources/xinetd/tutorial.shtml

3) 关于xinetdFAQ

4) 当前版本:xinetd Version 2.3.14

4xinetd配置

1) 转化inetd.conf xinetd.conf

xinetd的软件包里有一个xconv.pl脚本,可以将老的inetd.conf配置文件转为xinetd.conf配置文件,方法是:

./xconv.pl < /etc/inetd.conf > /tmp/xinetd.conf

2) 配置文件语法

a) #号开头的内容,系统视为注释行,给予忽略;

b) 空白行,系统给予忽略;

c) xinetd.conf只能有一个默认块

d) 设置的方法是:属性=值 []

e) 默认块可以使用的属性:log_type, log_on_success, log_on_failure, only_from, no_access, passenv, instances, disabled, and enabled

3) 属性含义:

xinetd的属性有45个之多,要详看每个参数的含义,可以参见“收藏文档”里的“配置xinetd文件,或者man xinetd.conf 手册。

(六) 网络相关

1. ping 

方法是:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 这样其它机器就不能ping 这台机器了

解禁pingecho 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

2. 使用 TCP SYN Cookie保护生效

SYN Attack是一种拒绝服务(DoS)攻击方式,会消耗掉系统中的所有资源,迫使服务器重新启动。使TCP SYN Cookie保护生效,可以防止一定的DoS攻击,方法是:

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

3. 限制用户可以登陆的终端

这个文件里规定了,root用户可以从哪个设备登录到系统上。只有在这个文件里列出来的终端设备名,才允许root用户登录到系统。没有的设备,root用户将不可以通过它登录到系统。

如果这个文件存在,但是其内容是空的。则系统不允许root从任何地方登录到系统,用户只能通过其它用户登录到系统,然后用su命令换到root用户。

如果这个文件不存在,则root用户可以从任何终端设备登录到系统。应该将这个文件里的部分内注掉,这样以加强系统的安全性。

这个文件里字段含义:

console 控制台

vc虚拟控制台

tty:终端设备

pts:伪从终端

ptmx:伪主终端

(七) 限制系统资源

限制用户对系统资源的使用,可以避免拒绝服务。要限制用户对系统资源的使用,方法如下:

1、 编辑/etc/security/limits.conf文件,加上要限制的资源。这个文件用法,可以man limits.conf

2、 编辑/etc/pam.d/login文件,在文件的尾部加入下面一行:

session  required /lib/security/pam_limits.so

阅读(1959) | 评论(0) | 转发(0) |
0

上一篇:命令用法汇总

下一篇:关于LVM(一)

给主人留下些什么吧!~~