-
Notifications
You must be signed in to change notification settings - Fork 18
harden server remove unnecessary things
下列针对使用apt包管理系linux
关闭/删除不必要的服务,减小对外暴露的端口,同时减小系统资源的占用
根据操作25x服务器的经验,很多时候服务器在提供服务的同时,也在运行着和业务不相关的服务。 尤其是使用了docker之后,运行在容器中的服务才是我们需要关心的。目标就是要削减宿主机上的无关进程,将资源 留予docker
这一系列的服务是危险的,对外暴露了连接,应该及时禁止
列出所有在监听端口的程序
netstat -plunt
# or
lsof -i
最好的情况是,只保留sshd与业务服务,其它的服务全部禁止
1 sysv
service <name> stop
2 systemd
systemctl stop <name>
这一步骤只是对服务进行了临时的禁止,如果再次开机运行,作为自启动项的服务还会再次启动。我们还需要对服务进行更彻底的禁止
目前ubuntu使用upstart和systemd两种管理工具来管理服务的启动,对服务的查看修改要结合 一起使用才完善
参考:
当前大部分系统都使用systemd来管理启动项,兼容sysv&upstart,本质上是通过调用sysv&upstart脚本来实现的。 推荐使用systemd来操作
1 sysv
工具
apt-get install sysv-rc-conf
列举出当前所有启动服务的情况
sysv-rc-conf --list
# or
service --status-all
对服务自动启动/禁用进行配置(进入交互式界面,对相应的服务启动/禁止进行配置)
sudo sysv-rc-conf
2 systemd
列举出当前服务启动情况
systemctl -r --type service --state active
所有开机自启动的服务项
systemctl list-unit-files --state enabled
对服务自动启动/禁用进行配置
systemctl enable/disable <name>
这一步骤禁止了服务的启动,已经达成我们的目的。但是从不启动的服务就是无用的磁盘文件。可以考虑将服务彻底卸载
下面所有的操作,多少会涉及安装包的卸载删除过程。因为安装包之间复杂的依赖关系,卸载一个包很可能会连带
删除其它关键的包,我就曾经因为删除了procps
包导致启动内核一起被删除了...reboot机器都启动不了了
-
apt-get remove
时不要盲目直接确认,先审查即将被删除的软件包列表 -
apt-get remove -s
,使用-s
参数,模拟删除的流程,dry-run
1 mysql
我们使用TableDB作为数据库,mysql根本是不需要的。不管其开机启动情况如何,直接卸载就行
sudo apt-get remove mysql-server mysql-client
mysql-common
有时作为其它上层软件的依赖,可以保留
2 hudson
目前的CI使用jenkins并且运行于docker中,宿主机上安装的hudson没有必要而且还占用端口8080,直接卸载
sudo apt-get remove hudson
3 postfix
通常一些程序会使用邮件服务来进行log的通知,这里往往postfix会被作为依赖一起被安装并作为自启动服务。而这种邮件服务是可 有可无的,所以最好还是直接停止服务并禁止自启动
systemctl stop postfix.service
4 NFS
我们并没有使用NFS,直接禁止
systemctl stop nfs-common.service
systemctl stop rpcbind.service
systemctl disable nfs-common.service
systemctl disable nfs-common.service
apt-get remove nfs-common rpcbind
5 rsync
rsync在服务器间同步传递文件,它以两种模式运行,使用不同的参数,它就可以作为server或client来使用。如果自己的服务器主动向 外部连接进行文件同步,我们的服务器端就是作为client来运行的。相应的,rsync服务可以禁止
systemctl disable rsync.service
6 avahi
Avahi允许程序在不需要进行手动网络配置的情况 下,在一个本地网络中发布和获知各种服务和主机。 例如,当某用户把他的计算机接入到某个局域网时,如果他的机器运行有Avahi服务,则Avahi程式自 动广播,从而发现网络中可用的打印机、共享文件和可相互聊天的其他用户。 这有点象他正在接收局域网中的各种网络广告一样。
可以禁止
systemctl stop avahi-daemon.service
systemctl disable avahi-daemon.service
7 miniSSDPD
systemctl stop minissdpd.service
apt, apt-get, aptitude三个工具是常用的
apt-get install aptitude
- 使用
-s
参数,模拟删除 - 清楚
apt remove
所要删除的包,确定没有关联到关键包,再删除
时常更新软件包,及时打上官方patch,保持在最新版本
首先更新索引
apt update
可升级的安装包
apt list --upgradable
安全升级(在不删除其它包的情况下升级)
aptitude safe-upgrade
系统升级(有时可能会删除某些包,看清楚再下决定)
apt full-upgrade
// or
apt-get dist-upgrade
每个包都多少与其它包存在依赖关系。所有依赖关系可视化出来就是一棵庞大的树。
每个软件包都有 depends 和 reverse depends
一个包可能
- 没有任何依赖。不依赖其它包,其它包也不依赖它。非常好管理,随时安装,随时卸载
- 底层包。不依赖其它包,其它包依赖于它。这种包理论上是需要保留的,除非所有依赖于它的包都已经被卸载
- 上层包。只依赖其它包,没有包依赖于它。这样的包如果不需要可以直接卸载,经常的,再运行
apt-get autoremove
可以将这个包引入的其它无用依赖也清除 - 中层包。存在依赖与反向依赖。绝大部分包都是这样的。由于反向依赖的限制,一般不轻易删除
查看一个包的依赖
apt-cache depends vim
查看反向依赖
apt-cache rdepends vim
当使用apt-get remove
的时候,默认会将选中的包与其反向依赖全部删除。
这时要非常小心,因为有一些关键包会依赖于你要删除的包
常见可清理的软件包
- mysql-client mysql-server
- rpcbind nfs-common
- others
目前251,252都运行在runlevel 5,运行着图形界面的服务。对于服务器来说是不必要的。
当前运行的runlevel,runlevel 5会返回graphical.target
systemctl get-default
当前可选择的runlevel
systemctl list-units --type target
服务器,可以设置其运行在runlevel 3
systemctl set-default multi-user.target
这样就免除了X server服务