Linux课程笔记 系统初步优化
一 配置优化Centos5.XLinux系统
1.添加一个普通用户账号
生产环境,一般要避免直接使用root账户操作。
一次性设置密码小技巧:echo “qbf1932” | passwd –stdin qinbf && history –c
2. CentOS安装完毕,首先应该修改更新源,并升级到最新系统
国内速度较快的的常用更新源如下:
—http://mirrors.sohu.com/
—http://mirrors.163.com/
法一:将已经编辑好的CentOS-Base.repo文件上传到/etc/yum.repos.d目下,覆盖当前的CentOS-Base.repo文件。
法二:
[root@test2 ~]# cd /etc/yum.repos.d/
[root@test2 yum.repos.d]# /bin/cp CentOS-Base.repo CentOS-Base.repo.ori
[root@test2 yum.repos.d]# wget http://mirrors.sohu.com/help/CentOS-Base-sohu.repo
--2013-05-16 23:46:23-- http://mirrors.sohu.com/help/CentOS-Base-sohu.repo
正在解析主机 mirrors.sohu.com... 221.236.12.140
Connecting to mirrors.sohu.com|221.236.12.140|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2299 (2.2K) [application/octet-stream]
Saving to: `CentOS-Base-sohu.repo'
100%[==============================================================================================================================>] 2,299 --.-K/s in 0.06s
2013-05-16 23:46:23 (35.1 KB/s) - `CentOS-Base-sohu.repo' saved [2299/2299]
[root@test2 yum.repos.d]# /bin/mv CentOS-Base-sohu.repo CentOS-Base.repo
[root@test2 yum.repos.d]# cat CentOS-Base.repo
[updates]
name=CentOS-$releasever - Updates - sohu.com
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://mirrors.sohu.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
然后使用如下命令,更新系统到最新。
[root@test2 yum.repos.d]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*
[root@test2 yum.repos.d]# yum update
3. 安装必要的软件包
最小化安装,只安装需要的软件包和软件包组。
安装必要的软件工具,比如lrzsz、sysstat
yum install lrzsz sysstat -y
需要安装系统安装时落下的软件包组,可以使用如下命令:
yum groupinstall “Development Tools” -y
4. 清理开机自启动服务
应该遵守最小化原则,尽量不安装不使用的软件,尽量不开启不需要的服务,这样的系统的性能和安全性才是最好的。
(1) 首先通过脚本命令关闭级别3所有的开机自启动服务
for qinbf in `chkconfig --list | grep 3:on |awk ‘{print $1}’`;do chkconfig --level 3 $qinbf off;done
NetworkManager 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
acpid 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
anacron 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
atd 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
auditd 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
autofs 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
avahi-daemon 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
avahi-dnsconfd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
…………………
(2) 然后执行如下命令开启需要开机自启动的服务
for qinbf in crond network syslog sshd; do chkconfig --level 3 $qinbf on;done
[root@test2 ~]# chkconfig --list |grep 3:启用
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
syslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
注:在中文的客户端,应该是grep 3:启用。
5. 更改ssh登录配置
(1)备份配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori
(2) 修改配置文件vi /etc/ssh/sshd_config
#--------------------------qinbf-----------------------------------#
Port 19880 #默认端口
PermitRootLogin no #禁止root登陆
PermitEmptyPasswords no #禁止空密码登陆
UseDNS no #不使用DNS
#---------------------------qinbf-----------------------------------#
(3) 重启sshd服务/etc/init.d/sshd restart
(4) 验证查看netstat -tupnl或者lsof -i tcp:19880
[root@test2 ~]# netstat –tupnl
………………….
tcp 0 0 :::19880 :::* LISTEN 10898/sshd
………………….
[root@test2 ~]# lsof -i:19880
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10898 root 3u IPv6 38755 0t0 TCP *:19880 (LISTEN)
sshd 10898 root 4u IPv4 38757 0t0 TCP *:19880 (LISTEN)
6. 将普通账号加入到sudo管理
为了安全及管理的方便,可将需要有root权限的用户名加入sudo管理,这样用户通过自己的普通账号登陆,就可以以root的权限来管理整个系统,而不需要有root账号及密码。
执行如下命令,即可打开visudo的配置文件
visudo #-->相当于直接编辑/etc/sudoers,单用命令方式更加安全,推荐
在文件的中间如下内容的下面添加需要root权限的用户名,格式如下:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
qinbf ALL=(ALL) ALL #--à这个配置表示qinbf可拥有完全的系统管理权限
等qinbf登陆系统时,就可以使用sudo ls -l /root,以root的权限执行命令。
[qinbf@test2 ~]$ ls -l /root
ls: /root: 权限不够
[qinbf@test2 ~]$ sudo ls -l /root
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for qinbf:
总计 23284
-rw------- 1 root root 953 2012-05-28 anaconda-ks.cfg
-rw-r--r-- 1 root root 20896 2012-05-28 install.log
-rw-r--r-- 1 root root 0 2012-05-28 install.log.syslog
drwxrwxrwx 33 7155 wheel 4096 2010-08-04 mysql-5.1.50
-rw-r--r-- 1 root root 23750564 2010-08-04 mysql-5.1.50.tar.gz
-rwxr-xr-x 1 root root 334 2012-06-08 rsync.sh
问题一:从root切换到普通用户时,执行ifconfig会提示
[qinbf@test2 ~]$ ifconfig
-bash:ifconfig: command not found
请问这是什么问题?
解答:这是普通用户环境变量的问题:
解决办法:对标普通用户和root账户的$PATH
经过对比发现,普通用户缺少/usr/local/sbin:/sbin:/usr/sbin
[qinbf@test2 ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/qinbf/bin
[root@test2 ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
然后编辑~/.bash_profile环境变量文件,把/usr/local/sbin:/sbin:/usr/sbin添加到PATH环境变量里,注意,每个路径之间用冒号分隔。
PATH=$PATH:$HOME/bin:/usr/local/sbin:/sbin:/usr/sbin
然后执行source ~/.bash_profile,再观察echo $PATH的时候,就发现已经添加进去了。
[qinbf@test2 ~]$ source ~/.bash_profile
[qinbf@test2 ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/qinbf/bin:/home/qinbf/bin:/usr/local/sbin:/sbin:/usr/sbin
问题二:执行系列命令时,发现需要输入密码,请问是输入哪个账号的密码?
[qinbf@test2 ~]$ sudo su –
解答:要输入的是普通账号qinbf的密码。根据提示:[sudo] password for qinbf:可知。
7. 修改中文显示
在/etc/sysconfig/i18n添加如下内容:
echo ‘LANG=”zh_CN.GB18030” >/etc/sysconfig/i18n
执行source /etc/sysconfig/i18n使上文生效。
提示:这个中文显示配置要跟你自己的SSH客户端的配置一致,比如都是使用UTF8的字符集。
8. 服务器时间同步
echo ‘*/5 * * * * /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1 ‘>>/var/spool/cron/root
在机器数量少时,以上定时任务同步时间就可以了,如果机器数量大时,可以在内网再部署一个时间同步服务器ntp server。
9. 加大服务器文件描述符
编辑/etc/security/limits.conf,末尾加上“* - nofile 65535 ”
配置完成后,重新登录即可使用ulimit -n查看验证。
[qinbf@test2 ~]$ ulimit -n
65535
10. 调整内核参数文件/etc/sysctl.conf
执行sysctl -p使修改生效。后续会详细讲述具体优化的细节,这里只需要有一个概念即可。
11. 将所有的优化写入脚本一键优化
二 Linux系统目录结构介绍
1. Linux文件系统有如下两个特点:
(1) 逻辑上所有的目录都是在一个级别最高的根目录(/)下,其下面的子目录是一个层次(或树状结构),但可以分布在不同设备或者是在不同分区上
(2) 所有的目录内容按照类别组织,比如可执行程序是在/usr/sbin下,它的数据文件和帮助是在/usr/share下,它的配置文件却是在/etc下。
2. Linux的根目录
Linux目录结构的最顶端是“/”,我们称/为Linux的根目录,是所有目录的起始点,所有的目录、文件、设备都是在/之下。
可以使用tree -L 1 / 查看根目录下的目录。
[qinbf@test2 ~]$ tree -L 1 /
/
|-- application
|-- bin
|-- boot
|-- data
|-- dev
|-- etc
|-- home
|-- lib
|-- lib64
|-- lost+found
|-- media
|-- misc
|-- mnt
|-- opt
|-- proc
|-- root
|-- sbin
|-- selinux
|-- srv
|-- sys
|-- tmp
|-- usr
`-- var
23 directories, 0 files
常见目录整理(按照重要程度)
目录 |
说明 |
/etc |
常用系统及二进制安装包配置文件默认路径和服务启动命令目录 |
/proc |
操作系统运行时,进程信息及内核信息(比如CPU、硬盘分区等)存放这里。/proc目录是伪装的文件系统破冗长的挂载目录,proc并不是真正的目录 |
/dev/ |
设备文件目录,比如声卡、磁盘 |
/tmp |
临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的,权限比较特殊。 |
/var |
这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib用来存放一些库文件,比如MYSQL的,以及MYSQL数据库的存放地 |
/home |
普通用户的家目录默认存放目录 |
一些重要的子目录说明
目录 |
说明 |
/etc/sysconfig/network-scripts/ifcfg-eth0 |
配置网络地址及GW等 |
/etc/resolv.conf |
设置本机的客户端DNS |
/etc/hosts |
设定用户IP与名字(或域名)的对应表,相当于本地LAN内的DNS |
/etc/sysconfig/network |
可修改机器名及网卡启动等配置 |
/etc/fstab |
记录开机要mount的文件系统 |
/etc/inittab |
设定文件启动时init进程将把系统设置成什么样的runlevel及加载相关的启动文件设置 |
/etc/exports |
设定NFS系统用的配置文件路径 |
/etc/init.d |
这个目录是用来存放系统或服务器以system V模式启动的脚本,这在以system V模式启动或初始化的系统中常见 |
/etc/xinit.d |
如果服务器是通过xinetd模式运行的,它的脚本要放在这个目录下,但是有些系统中没有这个目录 |
/var目录说明
目录 |
说明 |
/var |
日志文件 |
/var/log |
各种系统日志存放地 |
/var/log/message |
系统信息默认日志文件,非常重要。按周自动轮循 |
/var/log/secure |
记录登入系统存取信息的文件,按周自动轮循例如pop3、ssh/ftp |
/var/log/wtmp |
记录登录信息的文件,是last命令调用的文件 |
/var/spool /var/spool/cron |
定时任务crontab默认目录,按用户命名的文件 |
/var/spool/mail |
系统用户邮件存放目录 |
/var/spool/clientmqueue |
临时邮件目录,有很多原因会导致这个目录碎文件很多,比如crontab命令不加>/dev/null等 |
三 Linux文件格式和扩展名
1. Linux的文件类型
(1) 在linux系统中,一切设备介文件。文件类型包含有普通文件、目录、字符设备、块设备文件、符号链接文件
(2) 在ls -l显示文件属性内容后,第一列的第一个字符就是用来区分文件类型的:
d:表示这是一个目录
-:表示这是一个普通文件
I:表示这是一个符号链接文件,实际上它指向另一个文件
b、c:分别区块设备和其他外围设备,是特殊类型文件
s、p:这些文件关系到系统的数据结构和管道,通常很少见到。
建议初学者掌握d、-、l这三种类型
(3) ls –l中显示文件属性内容后,第一列的第一个字符是“-”,表示这是普通文件,删除使用rm 文件名。Windows中的ppt、rar、zip等在linux下都是普通文件。
(4) ls -ld 目录名,可以看到第一列的第一个字符是d,表示这是目录。创建目录的命令使用mkdir、或cp命令,cp可以把一个目录复制为另一个目录,删除用rm –r或rmdir(删除空目录才可以)命令。
特别提示:下面是执行ls -F的结果,在写脚本时可以直接区别目录和文件:每个目录的后面多了个斜线“/”
在生产环境中,我们一般是通过下列办法来过滤出目录文件的:
ls -F /etc/ | grep “/$”
ls -l /etc/ | grep “^d”
==============涉及的正则表达式部分简要说明================
^表示以…开头,^d表示以d开头。
$表示以…结尾,/$表示以”/”结尾。
5. 一般可以用mknod来创建块设备(b)和字符设备(c),用rm来删除,在目前最新的linux发型版本中,我们一般不需要自己创建设备文件,因为这些文件是和内核关联的。
Linux中查看硬件改动的方法:
/etc/init.d/kudzu start
[root@test2 ~]# /etc/init.d/kudzu start
正在检查新硬件 [确定]
6. 套接口文件
当我们启动MYSQL服务时,会产生一个mysql.sock文件,这个文件的属性的第一个字符是s。
sock文件也是一类特殊文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行数据通信。
7. ls -l显示文件属性,第一列的第一个字符是“l”,表示这是链接文件。
可通过ln –s 源文件 新文件名 创建。
8. Linux下扩展名的作用
在linux下,虽然扩展名没什么实际意义,但是为了兼容windows,同时便于我们大多数习惯了window的用户区分文件的不同,还是习惯通过扩展名来表示不同文件的类型。举例如下:
(1) .tar、.tar.gz、.tgz表示压缩文件
(2) .sh表示shell脚本文件
(3) .pl表示通过perl开发的程序
四 Linux系统用户和用户组介绍
1. Linux的单用户多任务
登录系统后,可以同时开启很多的任务和进程,而各自的任务对其他任务没有影响,这种一个用户登录系统执行多个任务和进程的情况,就称为单用户多任务
2. Linux的多用户多任务
多个人同时使用一个系统,并不是大家同时挤到一起在一台服务器的键盘和显示器前来操作,多用户可能是通过SSH客户端工具等远程登录服务器来进行。
3. Linux系统用户角色划分
用户在系统中分角色的,角色不同,权限和所完成的任务也不同,值得注意的是角色是通过UID和GID来识别的,而且一个UID是唯一标识一个系统用户的账号,服务器能够识别的尽是UID和GID这样的数字,而用户系统账号的名称其实是给人看的
- 超级用户
默认是root用户,其UID和GID均为0,在每台的linux操作系统都是唯一且真实存在的,拥有最高的管理权限,在生产环境中,一般会禁止root账号远程SSH登录。
- 普通用户这类用户一般是具备系统管理员root的权限的运维人员添加的,仅具备操作自己家目录中的文件及目录的权限。
- 虚拟用户
与真实普通用户区分开来,这类用户最大的特点是安装系统后默认就会存在,且默认情况下不能登录系统,它们是系统运行不可缺少的,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求,例如系统默认的bin、nobody、mail用户等。在做系统安全优化是,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)。
4. 多用户操作系统安全
多用户系统也更方便更为安全。比如普通用户qinbf为了让某个文件不被其他人看到,设置了一下该文件的权限为只有普通用户qinbf一个用户可读可写可编辑,这样就只有qinbf账号可以(root账号也可以)对其私有文件进行操作,从而达到了保护每个用户的私有数据安全。
[root@test2 ~]# cat /home/qinbf/qinbf.txt
hello
[root@test2 ~]# ll /home/qinbf/qinbf.txt
-rwx------ 1 qinbf qinbf 6 05-19 19:19 /home/qinbf/qinbf.txt
[root@test2 ~]# echo "root" >>/home/qinbf/qinbf.txt ---à使用root账户编辑文件
[root@test2 ~]# cat /home/qinbf/qinbf.txt
hello
root --------------------------àroot账户编辑成功
[root@test2 ~]# rm /home/qinbf/qinbf.txt
rm:是否删除 一般文件 “/home/qinbf/qinbf.txt”? y
[root@test2 ~]# ll /home/qinbf/
总计 0 -------àroot账号删除成功
5. 用户(user)介绍
通过建立不同属性的用户,一方面可以合理的利用和控制系统资源,另一方面可以帮助用户组织文件,提供对用户文件的安全性进行保护。
每个用户都有一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能登入系统和相应的目录。
在生产环境中,一般会为每个有权限管理服务器的运维人员分配一个独立的普通用户账号及8位(包含数字、字母)以上的密码,该人员只能通过建立的这个账号登陆到系统中进行维护,当需要超级用户权限时,可以通过“sudo 命令”方式来执行仅有root权限才允许执行的权限。维护时,如果不需要root权限,就不要进入root用户下操作。
6. 用户组(group)介绍
Linux系统中的用户组(group)就是具有相同特征的集合。
有时,我们可以把对同一个文件或者目录具有相同权限的用户加入同一个用户组,这样简化了运维管理工作。
7. 用户和用户组的对应关系
用户和用户组的对应关系有:一对一、一对多、多对一、多对多。
8. 用户及用户组配置文件介绍
Linux系统下的账户文件主要有/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow文件。
- /etc/passwd
文件中每行定义一个用户账号,有多少行就表示多少个账号,各内容之间通过“:”划分了多个字段,共7部分,分别定义了账号的不同属性。
[root@test2 ~]# head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Root :x :0 :0 :root :/root :/bin:/bash
名称 密码 UID GID 说明 家目录 shell解释器
/etc/passwd文件中一行的各个字段详细说明
字段名称 |
注释说明 |
账号名称 |
和UID对应,这是用户登录时使用的账号名称,在系统中是唯一的,不能重名 |
账号密码 |
早起的linux系统中,该字段存放账号密码,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了,这里可以看到一个字母X,表示该用户的密码是/etc/shadow文件中保护的 |
账号UID |
账号UID一般是由一个整数表示的,范围是0-65535 |
账号GID |
账号GID一般也是有一个整数表示的,范围也是0-65535,当添加账号是,默认情况下会同时建立一个与用户名相同且UID和GID相同的组 |
用户说明 |
这个字段对这个账户的描述说明 |
用户家目录 |
用户登陆后首先进入的目录,一般为“/home/用户名”这样的目录 |
Shell解释器 |
当前用户登陆后所使用的shell,在centos/rhel等linux系统中,默认的shell为bash,就是在这里设置的。如果不希望用户登录系统,可以通过usermod或者手工修改配置文件/etc/passwd,将该字段改为/sbin/nologin即可。如果你仔细看passwd文件的话,就会发现大部分内置系统虚拟账号的这个字段都是/sbin/nologin,表示禁止登陆系统,这是由于安全考虑的。 |
/etc/passwd中有关UID字段的限制说明
UID整数范围 |
具备该UID用户特性 |
0 |
当用户的UID为0时,表示这个账号为超级管理账号,如果要增加一个系统管理账号的话,只需要将该账号的UID改为0即可,但是不建议这么做。 |
1-499 |
这个范围是保留刚给系统使用的UID,之所以这样划分,是为了放置人为建立账号的UID和系统UDI之间冲突。并没有其他特殊的含义。细心的同学可以看到passwd虚拟用户的UID都会在这个范围内,除了0之外,所有的UID使用上没有区别。 |
500-65535 |
普通账户UID,当使用useradd qinbf建立账号时,默认情况下就是从500开始的,但是我们可以随时指定UID来创建账户 |
最后 我们来看看/etc/passwd的权限
[root@test2 ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1758 05-17 02:23 /etc/passwd
- /etc/shadow
由于passwd文件必须要被所有的用户读,所以会带来安全隐患,而shadow文件就是为了解决这个安全隐患而增加的
[root@test2 ~]# ll /etc/shadow
-r-------- 1 root root 1118 05-17 02:24 /etc/shadow
可以发现/etc/shadow是只对root只读的权限,其文件内容为
[root@test2 ~]# head -5 /etc/shadow
root:$1$nOtK7PlW$eY9mkhnf9qvOCS3RTL64y.:15488:0:99999:7:::
bin:*:15488:0:99999:7:::
daemon:*:15488:0:99999:7:::
adm:*:15488:0:99999:7:::
lp:*:15488:0:99999:7:::
- /etc/group
/etc/group文件是用户组的配置文件,内容包括用户和用户组,并且能显示用户归属哪个用户组。如果某个用户下有对系统管理有最重要的内容,那么最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去。
[root@test2 ~]# ll /etc/group
-rw-r--r-- 1 root root 681 05-17 02:23 /etc/group
与/etc/passw相似,其文件权限也是644
/etc/group文件内容为:
[root@test2 ~]# head -5 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
/etc/group字段说明
字段名称 |
注释说明 |
用户组名 |
该组的名称 |
用户组密码 |
通常不需要设置改密码,由于安全原因,该密码被记录在/etc/gshadow,因此显示为X |
GID |
就是用户组的ID |
用户组成员 |
加入这个租的所有账号 |
- /etc/gshadow
/etc/gshadow/是/etc/gashadow的加密资讯文件,用户组管理密码就是存放在这个文件。/etc/gshadow和/etc/group是互补的两个文件。