Skip to content

harden server remove unnecessary things

DreamAndDead edited this page Aug 25, 2017 · 7 revisions

服务最小化

下列针对使用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>

这一步骤禁止了服务的启动,已经达成我们的目的。但是从不启动的服务就是无用的磁盘文件。可以考虑将服务彻底卸载

卸载服务

注意remove

下面所有的操作,多少会涉及安装包的卸载删除过程。因为安装包之间复杂的依赖关系,卸载一个包很可能会连带 删除其它关键的包,我就曾经因为删除了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

about avahi service

Avahi允许程序在不需要进行手动网络配置的情况 下,在一个本地网络中发布和获知各种服务和主机。 例如,当某用户把他的计算机接入到某个局域网时,如果他的机器运行有Avahi服务,则Avahi程式自 动广播,从而发现网络中可用的打印机、共享文件和可相互聊天的其他用户。 这有点象他正在接收局域网中的各种网络广告一样。

可以禁止

systemctl stop avahi-daemon.service
systemctl disable avahi-daemon.service

7 miniSSDPD

can i stop 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服务

Clone this wiki locally