3.2 Linux 系列
3.2.1物理安全
3.2.1.1 BIOS安全,设定引导口令
禁止从软盘启动,并且给BIOS加上密码。每次启动的时候都手工检查一下BIOS,这样可以提
高系统的安全性。禁止从软盘启动,可以阻止别人用特殊的软盘启动你的计算机;给BIOS加
上密码,可以防止有人改变BIOS的参数,比如:允许从软盘启动或不用输入口令就可以引导
计算机。
3.2.1.2 安全策略
有一点很重要而且必须指出的是:如果你不知道要保护什么,那么更本没有办法保证系统的
安全。所以必须要有一个安全策略,基于这样的一个策略才可以决定哪些东西允许别人访问
,哪些不允许。如何制定一个安全策略完全依赖于你对于安全的定义。下面的这些问题提供
一些一般性的指导方针:
1)如何定义保密的和敏感的信息?
2)重点防范
3)远程用户有必要访问你的系统吗?
4)系统中有保密的或敏感的信息吗?
5)如果这些信息被泄露给你的竞争者和外面的人有什么后果?
6)口令和加密能够提供足够的保护吗?
7)你想访问Internet吗?
8)你允许系统在Internet上有多大的访问量?
8) 如果发现系���被黑客入侵了,下一步该怎么做?
这个列表很短,真正的安全策略可能包含比这多得多的内容。可能你要做的第一件是:评估
一下自己的偏执程度。任何一个安全策略多少都有一定程度的“偏执”:确定到底在多大程
度上相信别人,包括内部的人和外部的人。安全策略必须在允许用户合理地使用可以完成工
作所必须的信息和完全禁止用户使用信息之间找到平衡点。这个平衡点就是由系统策略决定
的。
3.2.1.3 口令
这章的Linux安全概要就从口令的安全开始讲起。许多人都把所有的东西保存在计算机上,防
止别人查看这些信息的方法就是用口令把计算机保护起来。没有什么东西是绝对安全的。与
常识相反的是:无法破解的口令是不存在的。只要给足时间和资源,所有的口令都能用社会
工程(译者注:原文是social engineering,找不出更好的翻译,大致的意思是用社会和心理
学的知识,而不是用纯粹的技术手段)或强行计算的方法猜出来。
通过社会工程或其它方法获得服务器的口令是最简单和最流行的入侵服务器的方法。决大多
数的技术支持人员很容易获得其他用户的口令,因为用户的安全意识很差而且很轻易就相信
自己的同事,特别是帮助自己解决问题的人。有很多登记在案的成功入侵就是因为一些别有
用心的人利用安全管理上的松懈而获得成功的。有时候,在特定的时间在特定的地点,上级
或老板对员工喊话���有可能泄露机密,导致可怕的后果。
因为破解口令是一项很耗时间和资源的工作,所以应该使得口令文件难于破解,这样即使黑
客获取了口令文件也不能轻易破解。作为一个系统管理员,自己在每个周末运行一下口令破
解程序,是保证系统安全的好方法。这有利于尽早地发现和替换那些很容易被猜出来的口令
。而且,还要有一个好的口令检查机制,在用户选择新口令或改变旧口令的时候,来排除那
些有安全隐患的口令。那些字典里的单词、或者全是大写或全是小写的以及没有包含数字或
特殊字符的字符串是不能用来做口令的。我建议用下面的规则选择有效的口令:
口令至少要有6个字符,最好包含一个以上的数字或特殊字符。
口令不能太简单,所谓的简单就是很容易猜出来,也就是用自己的名字,电话号码、生日、
职业或者其它个人信息作为口令。
口令必须是有有效期的,在一段时间之后就要更换口令。
口令在这种情况下必须作废或者重新设定:如果发现有人试图猜测你的口令,而且已经试过
很多次了。
安装完Linux系统之后默认的最小口令长度为5。这就是说一个新的用户可以访问服务器,那
么他的口令必须多于5字符。但是这样是不够安全的,最好口令的长度能够大于8。可以强制
用户使用8个字符以上的口令。编辑“/etc/login.defs”文件,把最小口令长度由5改成8。
找到PASS_MIN_LEN 5 这一行,改为:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文
件。可以在这个文件中设定一些其它的安全策略,比如:口令的有效期。
3.2.1.4 root帐号
“root”帐号是Unix系统中享有特权的帐号。“root”帐号是不受任何限制和制约的。因为
系统认为root知道自己在做些什么,而且会按root说的做,不问任何问题。因此,可能会因
为敲错了一个命令,导致重要的系统文件被删除。用root帐号的时候,要非常非常小心。因
为安全原因,在不是绝对必要的情况下,不要用root帐号登录。特别要注意的是:不在自己
的服务器上的时候,千万不要在别的计算机上用“root”登录自己的服务器。这是非常非常
非常糟糕的一件事。
3.2.1.5 加密
加密时要用到密匙,密匙是一个特殊的数字,把密匙和需要加密的信息经过加密算法加密之
后,只有知道密匙的人才能把信息读出来。如果所有的计算机主机都在你的控制下,加密当
然是一个好方法,但是,如果其中一台“被信任的”主机被黑客控制了,你马上就有危险了
。这就不仅仅是用户的帐号和口令有危险了。在通常情况下,加密是用来保证机密信息在系
统中传送的安全。如果一台计算机被控制了,那么这些加密信息就会让人知道或是泄密了。
有一个好的安全策略,这种危险的可能性会降到最低,但是如果某台主机的密匙被泄露出去
,那么危险始终存在。
3.2.2 安全配置
3.2.2.1 “/etc/exports”文件
如果通过NFS把文件共享出来,那么一定要配置“/etc/exports”文件,使得访问限制尽可能
的严。这就是说,不要用通配符,不允许对根目录有写权限,而且尽可能只给只读权限。编
辑exports文件(vi /etc/exports)加入。例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
“/dir/to/export”是你想共享出来的目录,host.mydomain.com是允许访问这个目录的计算
机。<ro>代表只读,<root_squash>代表不允许对根目录进行写操作。使这些改变生效,你还
要运行“/usr/sbin/exportfs -a”命令。
注意:在服务器上装NFS服务是会有安全隐患的,就我个人而言,不建议你使用NFS。
3.2.2.2 “/etc/inetd.conf”文件
Inetd,也叫作“超级服务器”,根据网络请求装入网络程序。“inetd.conf”文件告诉ine
td监听哪些网络端口,为每个端口启动哪个服务。把Linux系统放在任何的网络环境中,第一
件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最
好卸载掉,这样黑客就少了一些攻击系统的机会。查看“/etc/inetd.conf”文件,了解一下
inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号),禁止任何不需要的服务,
再给inetd进程发���个SIGHUP信号。
第一步:把文件的许可权限改成600。
[root@cnns]# chmod 600 /etc/inetd.conf
第二步:确信文件的所有者是root。
[root@cnns]# stat /etc/inetd.conf
这个命令显示出来的信息应该是:
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change: Mon Sep 20 10:22:44 1999(00002.06:12:16)
第三步:编辑“inetd.conf”文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ft
p、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、au
th,等等。如果你觉得某些服务有用,可以不禁止这些���务。但是,把这些服务禁止掉,系
统受攻击的可能性就会小很多。改变后的“inetd.conf”文件的内容如下面所示:
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
#
# These are standard services.
#
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd
#login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
#talk dgram udp wait root /usr/sbin/tcpd in.talkd
#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
#
# The Internet UUCP service.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers." Do not uncomment
# this unless you *need* it.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
#bootps dgram udp wait root /usr/sbin/tcpd bootpd
#
# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers." Many sites choose to disable
# some or all of these services to improve security.
#
#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd
#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx
#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet
#<
# Authentication
#
#auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf
注意:改变了“inetd.conf”文件之后,别忘了给inetd进程发一个SIGHUP信号(killall -H
UP inetd)。
[root@cnns /root]# killall -HUP inetd
第四步: 为了保证“inetd.conf”文件的安全,可以用chattr命令把它设成不可改变。把
文件设成不可改变的只要用下面的命令:
[root@cnns]# chattr +i /etc/inetd.conf
这样可以避免“inetd.conf”文件的任何改变(意外或是别的原因)。一个有“i”属性的文件
是不能被改动的:不能删除或重命名,不能创建这个文件的连接,不能往这个文件里写数据
。只有系统管理员才能设置和清除这个属性。如果要改变inetd.conf文件,你必须先清除这
个不允许改变的标志:
[root@cnns]# chattr -i /etc/inetd.conf
3.2.2.3 TCP_WRAPPERS
在默认情况下,RedHat Linux允许所有的服务请求。用TCP_WRAPPERS来保护服务器的安全,
使其免受外部的攻击,比想象的要简单和轻松得多。在“/etc/hosts.deny”文件中加入“A
LL: ALL@ALL, PARANOID”以禁止所有计算机访问你的服务器,然后在“/etc/hosts.allow”
文件中一个一个加入允许访问你的服务器的计算机。这种作法是最安全的。
TCP_WRAPPERS是由两个文件控制的,依次是:“/etc/hosts.allow”和“/etc/hosts.deny”
。判断是依次进行的,具体的规则如下:
如果在在/etc/hosts.allow文件中有匹配的项(daemon, client),那么允许访问;否则,查
看/etc/hosts.deny,如果找到匹配的项,那么访问被禁止;否则,访问被允许。
第一步:编辑hosts.deny文件(vi /etc/hosts.deny)加入下面这些行:
Access is denied by default.
# Deny access to everyone.
ALL: ALL@ALL, PARANOID #Matches any host whose name does not match
its address, see bellow.
这样做的意思是:所有的服务、访问位置,如果没有被明确地允许,也就是在“/etc/hosts
.allow”中找不到匹配的项,就是被禁止的。
注意:加上“PARANOID”参数之后,如果要在服务器上使用telnet或ftp服务,就要在服务器
的“/etc/hosts”文件中加入允许使用telnet和ftp服务的客户端计算机的名字和IP地址。否
则,在显示登录提示之前,因为DNS的域名解析,可能要等上几分钟时间。
第二步:编辑“hosts.allow”文件(vi /etc/hosts.allow)。例如,可以加入下面这些行(被
授权访问的计算机要被明确地列出来):
sshd: 208.164.186.1 gate.openarch.com
被授权访问的计算机的IP地址是:208.164.186.1,主机名是:gate.openarch.com,允许使
用的服务是:sshd。
第三步:tcpdchk是检查TCP_WAPPERS配置的程序。它检查TCP_WAPPERS的配置,并报告它可以
发现的问题或潜在的问题。在所有的配置都完成了之后,请运行tcpdchk程序:[root@cnns]
# tcpdchk
3.2.2.4 “/etc/aliases”文件
Aliases文件如果管理错误或管理得太粗心了就会造成安全隐患。例如:很多的软件产商都把
“decode”这个别名放在aliases文件里。这样做的目的是为了方便通过email传送二进制文
件。在发送邮件的时候,用户把二进制文件用“uuencode”转成ASCII文件,然后把结果发给
接收端的“decode”。由这个别名让邮件信息通过“/usr/bin/uuencode”程序把二进制文件
重新转换成ASCII文件。如果允许“decode”出现在aliases文件中,可以想象将会有什么样
的安全隐患。
把定义“decode”这个别名的行从aliases文件中删除。同样地,每一个会运行程序的别名都
要好好查看一下,很有可能要把它们删除掉。要使改动生效,还必须运行:
[root@cnns]# /usr/bin/newaliases
编辑aliases文件(vi /etc/aliases),删除或注释掉下面这些行:
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ? remove or comment out.
#ingres: root ? remove or comment out.
nobody: root
#system: root ? remove or comment out.
#toor: root ? remove or comment out.
#uucp: root ? remove or comment out.
# Well-known aliases.
#manager: root ? remove or comment out.
#dumper: root ? remove or comment out.
#operator: root ? remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root's mail
#root: marc
别忘了运行“/usr/bin/newaliases”使改变生效。
3.2.2.5 防止sendmail被没有授权的用户滥用
最新版的sendmail(8.9.3)集成了很强大的防止垃圾邮件(anti-spam)的功能,可以防止邮件
服务器被没有授权的用户滥用。要实现这个功能可以通过编辑“/etc/sendmail.cf”文件,
改变配置文件以阻止那些发垃圾邮件的人。
编辑“sendmail.cf”文件(vi /etc/sendmail.cf),把这一行:
O PrivacyOptions=authwarnings
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy
这些改变可以防止发垃圾邮件的人使用sendmail中的“EXPN”和“VRFY”命令。这些命令经
常被没有授权的人使用。参考本书sendmail配置这���节以获得更多这方面的信息。
编辑“sendmail.cf”文件(vi /etc/sendmail.cf),把这一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改为:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
这将改变sendmail接受连接时所显示的提示信息。你要把“C=xx L=xx”中的“xx”改成你所
在的国家和地区编码。例如:我是这样写的“C=CN L=JL”,代表中国,吉林。这个改变不会
对sendmail有什么影响,但是news.admin.net-abuse.email新闻组的人建议这么做,主要是
为了预防法律上的问题。
3.2.2.6 不要显示系统提示信息
如果你不想让远程登录的用户看到系统的提示信息,你可以改变“/etc/inetd.conf”文件中
的telnet设置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上“-h”参数可以让daemon不显示任何系统信息,只显示登录提示。当然,只有在
服务器上装了telnet服务器才有这样做的必要。
3.2.2.7 “/etc/host.conf”文件
Linux用解析器(resolver)库把主机名翻译成IP地址。“/etc/host.conf”文件定义主机名是
怎样解析的。“/etc/host.conf”文件中的项告诉解析器库用什么服务,以什么顺序解析主
机名。
编辑“host.conf”文件(vi /etc/host.conf)加入下面这些行:
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
order选项指明的是选择服务的顺序。上面“order bind, hosts”说的是解析器库解析文件
名的时候先查询域名服务器,然后再查看“/etc/hosts”文件。因为性能和安全上的原因,
最好将解析器库的查找顺序设成先查域名服务器(bind)。当然也要先安装了DNS/BIND软件,
否则这样配置根本没有任何作用。
multi选项决定在“/etc/hosts”文件中出现的主机能不能有多个IP地址(多个网络界面)。具
有多个IP网络界面的主机被称为具有多个网络界面(multiomed),因为同时有多个IP地址也就
意味着这台主机有多个网络界面。例如:网关服务器就有多个IP地址,必须把这个选项设成
ON。
nospoof选项指明不允许IP伪装。IP伪装是把自己伪装成别的计算机去欺骗其它的计算机,获
得它的信任。这种攻击方法把自己伪装成别的服务器,并且与其它客户机、服务器和大型数
据存储系统建立网络连接或其它类型的网络活动。不管对任何类型的服务器,这个选项都要
设成ON。
3.2.2.8 路由协议
路由和路由协议会导致一些问题。IP原路径路由(IP source routing),也就是IP包包含到达
底目的地址的详细路径信息,是非常危险的,因为根据RFC 1122规定目的主机必须按原路径
返回这样的IP包。如果黑客能够伪造原路径路由的信息包,那么它就能截取返回的信息包,
并且欺骗你的计算机,让它觉得正在和它交换信息的是可以信任的主机。我强烈建议你禁止
IP原路径路由以避免这个安全漏洞。
用下面的命令在你的服务器上禁止IP原路径路由:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
把上面的命令加到“/etc/rc.d/rc.local”文件中去,你就不用在系统重新启动之后再把这
些命令敲一遍。注意,上面的命令将禁止所有的网络界面(lo、ethN、pppN,等等)的原路径
路由包。如果你打算安装书中介绍的IPCHAINS防火墙,就不必用这些命令了,因为在防火墙
的脚本文件中已经包含这些命令了。
3.2.2.9 使TCP SYN Cookie保护生效
“SYN Attack”是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务
器重新启动。拒绝服务(这种攻击方式用巨大的信息流来消耗系统的资源,以至于服务器不能
够响应正常的连接请求)是很容易被黑客利用的。在2.1系列的内核中,“syn cookie”只是
一个可选项,并没有使其生效。想要使其生效必须用下面的命令:
[root@cnns]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
把这个命令加入“/etc/rc.d/rc.local”文件中,等下次系统重新启动的时候就不必重新敲
一遍了。如果打算安装IPCHAINS防火墙,你就没有必要用这个命令,因为它已经包含在防火
墙的脚本文件里了。
3.2.2.10 防火墙
安全问题的另一个解决方案是把计算机主机和内部计算机间的信息传送同外部的网络隔离开
,只让内部网络与外部网络之间的信息交流,通过一个安全的网关进行。这样一个网关叫做
防火墙,在下面的一些章节我们会用很大的篇幅介绍防火墙。
3.2.2.11 “/etc/services”文件
端口号和标准服务之间的对应关系在RFC 1700 “Assigned Numbers”中有详细的定义。“
/etc/services”文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每
一台主机上都存在,其文件名是“/etc/services”。只有“root”用户才有权限修改这个文
件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务
所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删
除和改变。为了保护这个文件可以用下面的命令:
[root@cnns]# chattr +i /etc/services
3.2.2.12 “/etc/securetty”文件
“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。登录程序(通常
是“/bin/login”)需要读取“/etc/securetty”文件。它的格式是:列出来的tty设备都是
允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。
注释掉(在这一行的开头加上#号)所有你想不让root登录的tty设备。
编辑securetty文件(vi /etc/securetty)象下面一样,注释掉一些行:
tty1
#tty2
#tty3
#tty4
/>#tty5
#tty6
#tty7
#tty8
上面这样做的意思是只允许root在tty1上登录。我建议只允许root在一个tty设备上登录,如
果从其它tty上登录,用“su”命令把身份转成“root”。
3.2.2.13 特殊的帐号
禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系统中就提供这
样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多
的帐号,就越容易受到攻击。
我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上shadow口令的
支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装服务器,那么在“安全
验证配置”这一步就已经选上“Enable Shaow Passwords”这个选项了。
在系统中删除一个用户可以用这个命令:
[root@cnns]# userdel username
在系统中删除一个组可以用这个命令:
[root@cnns]# groupdel username
第一步 用下面的命令删除一些不必要的用户:
[root@cnns]# userdel adm
[root@cnns]# userdel lp
[root@cnns]# userdel sync
[root@cnns]# userdel shutdown
[root@cnns]# userdel halt
[root@cnns]# userdel news
[root@cnns]# userdel uucp
[root@cnns]# userdel operator
[root@cnns]# userdel games (如果不用X Window服务器,可以删除这个用户)
[root@cnns]# userdel gopher
[root@cnns]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户)
第二步 输入下面的命令删除一些不必要的组:
[root@cnns]# groupdel adm
[root@cnns]# groupdel lp
[root@cnns]# groupdel news
[root@cnns]# groupdel uucp
[root@cnns]# groupdel games (delete this group if you don’t use X Window Server
).
[root@cnns]# groupdel dip
[root@cnns]# groupdel pppusers
[root@cnns]# groupdel popusers (delete this group if you don’t use pop server f
or email).
[root@cnns]# groupdel slipusers
第三步 在系统中加入必要的用户:
在系统中添加用户,用这个命令:
[root@cnns]# useradd username
给系统中的用户添加或改变口令,用这个命令:
[root@cnns]# passwd username
例如:
[root@cnns]# useradd admin
[root@cnns]# passwd admin
这些命令的输出是这样的:
Changing password for user admin
New UNIX password: somepasswd
passwd: all authentication tokens updated successfully
第四步 “不许改变”位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人
创建这个文件的符号连接。删除“/etc/passwd”、“/etc/shadow”、“/etc/group”或“
/etc/gshadow”都是黑客的攻击方法。
给口令文件和组文件设置不可改变位,可以用下面的命令:
[root@cnns]# chattr +i /etc/passwd
[root@cnns]# chattr +i /etc/shadow
[root@cnns]# chattr +i /etc/group
[root@cnns]# chattr +i /etc/gshadow
注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不可改变位
,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那些会自动在口令文
件和组文件中加入新用户的rpm软件包的时候,在安装过程中就会出现出错的提示。