VPS安装后需要做的几件事

创建用户及修改密码

1
2
useradd jangrui
passwd jangrui

Sudo命令进阶

修改sudoers

1
vim /etc/sudoers

在 root ALL=(ALL) ALL 下一行插入下面内容:

1
jangrui ALL=(ALL) ALL

注:用户名后面跟tab键

在文件最后一行添加:

1
2
3
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=0
Defaults !syslog

:x!保存退出。

在/var/log下新建sudo.log日志文件:

1
touch /var/log/sudo.log

修改/etc/rsyslog.conf,在最后找到下面内容:

1
local7.* /var/log/boot.log

在下面添加:

1
local2.debug /var/log/sudo.log

重启日志守候进程:

1
ps aux|grep rsyslogd

把得到的syslogd进程的PID(输出的第二列是PID)填入下面:

1
kill –hup PID

配置VIM

注意:

  • 如果系统中没有安装 vim,可以试试看 vi,只是没有 vim 好用和好看罢了。
  • 如果不用 vim 就直接跳到下面的 1.3。

安装 vim :

1
yum -y install vim

为了使之彩色显示代码,同时还支持行号标记和鼠标定位,需要编辑 vim 配置文件:

1
vim /etc/vimrc

从键盘输入 i 进入编辑模式,按键盘上的 PgDn (或上、下、左、右键)到文本最后一行最后一个字符之后按回车换行,在末尾分两行输入:

1
2
set nu
set mouse=a

从键盘输入 Ctrl+c,然后输入 :wq 保存、退出(这里 : 号表示退出编辑模式进入指令模式,w 表示保存,q 表示退出)(单纯的退出而不保存则是输入 :q,强制退出则是 :q!)。

设置 HOSTNAME

先将配置写到 /etc/sysconfig/network 文件的末尾。直接用 echo 指令将内容使用 >> 操作符附加到该文件最后一行即可,(注意该条语句各部分之间的空格,一共三个)

1
echo "HOSTNAME=jangrui" >> /etc/sysconfig/network

注:HOSTNAME=jangrui 即:修改主机名为jangrui

设置时区为上海

查看系统中的时区配置文件:

1
ls /usr/share/zoneinfo

上海时区文件应该在 Asia 目录下:

1
ls /usr/share/zoneinfo/Asia

我还是用上海时区吧。将 Shanghai 时区软连接到 localtime:

1
ln –sf /usr/share/zoneinfo/Shanghai /etc/localtime

看看时间:

1
2
[root@jangrui ~]# date
Thu Jun 16 08:54:42 CST 2016

这样基本上也可以了,现在系统使用的时间就是上海了,跟北京时间一样。

但是问题在于,重启 VPS 系统或者进行了重大升级之后,系统时间就又重置到默认状态了。这个很不方便,还需要进行刚才的操作。后来找了找,发现不仅需要设置系统时区,还需要更新系统的时钟配置。接着进行下面的操作。
将系统时钟设置为使用上海时区:

1
echo "ZONE=\"Asia/Shanghai\"" > "/etc/sysconfig/clock"

不过也许最好还是先看看 /etc/sysconfig/clock 文件里是否已经有了类似的语句,而只需要修改后面的时区配置,

1
2
[root@jangrui ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"

另外,有的 Linux 发行版里面配置不同,比如 OpenSUSE 里面的就是 TIMEZONE

1
TIMEZONE="Europe/London"

替换yum源

首先,下载对应版本repo文件, 放入/etc/yum.repos.d/(操作前请做好相应备份),我用的是163的源:

1
2
3
- [CentOS7](http://mirrors.163.com/.help/CentOS7-Base-163.repo)
- [CentOS6](http://mirrors.163.com/.help/CentOS6-Base-163.repo)
- [CentOS5](http://mirrors.163.com/.help/CentOS5-Base-163.repo)

然后,备份/etc/yum.repos.d/CentOS-Base.repo

1
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

运行以下命令生成缓存

1
2
yum clean all
yum makecache

先更新系统

1
yum -y update

配置SSH免密码登陆及加强SSH安全

配置SSH自动远程登录

在本地机器创建公钥

打开万能的终端,执行如下命令,无视一切输出,一路欢快地回车即可。

1
ssh-keygen -t rsa -C 'your email@domain.com'

-t 指定密钥类型,默认即 rsa ,可以省略,-C 设置注释文字,比如你的邮箱。
将前一步骤生成的公钥~/id_rsa.pub文件,复制到ssh服务器对应用户下的~/.ssh/authorized_keys文件。
当ssh服务器username用户目录下尚未有.ssh目录时使用此方式:

1
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

通用方式

1
scp ~/.ssh/id_rsa.pub username@hostname:~/

将公钥文件复制至ssh服务器

1
ssh username@hostname

使用用户名和密码方式登录至ssh服务器

1
mkdir .ssh

若.ssh目录已存在,可省略此步

1
cat id_rsa.pub >> .ssh/authorized_keys

将公钥文件id_rsa.pub文件内容追加到authorized_keys文件

权限问题

.ssh文件夹 700

1
chmod 700 ~/.ssh

authorized_keys文件 644

1
chmod 644 ~/.ssh/authorized_keys

允许密钥登录

允许用户自行使用成对的密钥系统登录服务器,这里仅针对协议版本2。

用户自己生成的公钥数据就放置于相应的(服务器上该用户自己的)用户目录(例如,/home/luser1)下的.ssh/authorized_keys 文件里面,

打开 /etc/ssh/sshd_config,找到下面内容:

1
2
3
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys

去调上面3行前面的#,保存后重启SSH服务。

1
/etc/init.d/sshd restart

附:SSH 配置文件样本(一些用 # 注释掉的行没有列上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Port 1234
Protocol 2
SyslogFacility AUTHPRIV
PermitRootLogin no
AllowUsers user1 user2
/etc/ssh/ssh_known_hosts
PermitEmptyPasswords no
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM no
# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding no
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
UseDNS no
Banner /etc/issue

使用 iptables 对连接进行限制

参考 Linux VPS 安全策略记录

因为 iptables 中的规则对顺序很敏感,下面先提几个方面,然后给出全部配置文件内容(以 # 注释来进行说明)。

限制 SSH 端口的连接错误次数(参考:Preventing brute force attacks using iptables recent matching);

限制单个 IP 对 80 端口的并发连接数;

限制 80 端口以及其它如邮件、SMTP等端口的连接速率(参考:Prevent DOS with iptables);

其它不符合标准的一律 DROP 掉。

我发现编辑 iptables 条目实际上不需要使用如下的命令行慢慢来操作,

1
iptables -A INPUT .........

而是可以将 iptables 文件下载下来,使用记事本之类的编辑器编辑(当然格式还是得参照已有的规则)来编写,然后再上传过去覆盖掉原来的,再使用下面的命令行来加载新规则即可,

1
service iptables restart

下面是我目前用的iptables 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Generated by iptables-save v1.4.7 on Fri Mar 9 23:08:51 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1301:2201856]
# 下面两个 chain 是用来记录 ssh 尝试登录次数的
:blacklist - [0:0]
:sshscan - [0:0]
# 2012.03.16 新增一个 CHAIN
:syn_flood - [0:0]
# rule 1 允许所有本机发出的通讯
-A INPUT -s 127.0.0.1/32 -j ACCEPT
# rule 2 限制 RELATED,ESTABLISHED 一类的连接速率为每秒钟 50 个,峰值 50;超过限制的则不接受
# 似乎不需要这么做,清除这一部分 2012.03.16
#-A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/sec --limit-burst 50 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 跳转到 syn_flood CHAIN 来判断是否有“洪水”攻击,2012.03.16
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood
# 有限接受 icmp 包,2012.03.16
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j LOG --log-prefix "PING-DROP: " --log-level 6
# rule 3 限制 80 端口新建连接的速度为 50 个每分钟,峰值 200;超过限制的不接受
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 50/min --limit-burst 200 -j ACCEPT
# 邮件服务基本上全部由 Google 企业邮局完成,删除下面有关 465 和 25 端口的条目,禁用这 2 个端口 2012.03.16
# rule 4 类似 rule 3 来限制 465 端口 #-A INPUT -p tcp -m tcp --dport 465 -m state --state NEW -m limit --limit 30/min --limit-burst 100 -j ACCEPT # rule 5 类似 rule 3 来限制 25 端口 #-A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -m limit --limit 30/min --limit-burst 100 -j ACCEPT
# rule 6 类似 rule 3 来限制 5678 端口(这是我特殊使用的一个端口)
-A INPUT -p tcp -m tcp --dport 5678 -m state --state NEW -m limit --limit 10/min --limit-burst 20 -j ACCEPT
# rule 7 限制 80 端口并发连接数不超过 20,否则发送 tcp reset 来拒绝连接
-A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
# rule 8,9 开放 53 端口(DNS 服务) # 似乎不开放这个端口也没有问题,禁用掉 2012.03.16 #-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT #-A INPUT -p udp -m udp --sport 53 -j ACCEPT
# rule 10 配合前面提到的两个 chain 来限制 ssh 新建连接,并对超过尝试次数的连接封锁指定时间
-A INPUT -p tcp -m tcp --dport 1234 -m state --state NEW -j sshscan
# rule 11 丢弃其它不满足前述规则的连接
-A INPUT -j DROP
# 以下是前面提到的 2 个检查 ssh 连接的 chain,blacklist 和 sshscan
-A blacklist -m recent --set --name blacklist --rsource
-A blacklist -j DROP
-A sshscan -m recent --update --seconds 600 --hitcount 1 --name blacklist --rsource -j DROP
-A sshscan -m recent --set --name counter1 --rsource
-A sshscan -m recent --set --name counter2 --rsource
-A sshscan -m recent --set --name counter3 --rsource
-A sshscan -m recent --update --seconds 20 --hitcount 3 --name counter1 --rsource -j blacklist
-A sshscan -m recent --update --seconds 200 --hitcount 15 --name counter2 --rsource -j blacklist
-A sshscan -m recent --update --seconds 2000 --hitcount 20 --name counter3 --rsource -j blacklist
-A sshscan -j ACCEPT
# 判断 syn_flood 攻击与否,不是则 RETURN(返回),否则 DROP 3012.03.16
-A syn_flood -m limit --limit 10/sec -j RETURN
-A syn_flood -j DROP
COMMIT
# Completed on Fri Mar 9 23:08:51 2012

另外,也有在 iptables 中限制 ICMP 连接的,我是统统丢弃了。需要的话请参考:

http://serverfault.com/questions/287998/is-my-linux-firewall-secure

centos7 时间同步和时区设置

设置系统时间为中国时区并启用时间同步

1
2
3
4
5
6
7
8
9
# 安装
yum install chrony
# 启用
systemctl start chronyd
systemctl enable chronyd
# 设置亚洲时区
timedatectl set-timezone Asia/Shanghai
# 启用NTP同步
timedatectl set-ntp yes

这样服务器的时间就跟NTP服务器同步了,非常简单的操作。

也可以不使用Chrony,用NTP服务的时间同步。但不推荐。

安装NTP服务使用其同步时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装ntp服务
yum install ntp
# 开机启动服务
systemctl enable ntpd
# 启动服务
systemctl start ntpd
# 设置亚洲时区
timedatectl set-timezone Asia/Shanghai
# 启用NTP同步
timedatectl set-ntp yes
# 重启ntp服务
systemctl restart ntpd
# 手动同步时间
ntpq -p

RTC设为本地时间会有告警

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# timedatectl set-local-rtc 1
[root@localhost ~]# timedatectl
Local time: Thu 2016-05-26 15:31:59 CST
Universal time: Thu 2016-05-26 07:31:59 UTC
RTC time: Thu 2016-05-26 15:31:59
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: yes
DST active: n/a
Warning: The system is configured to read the RTC time in the local time zone.
This mode can not be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.

因为硬件时钟不能保存时区和夏令时调整,修改后就无法从硬件时钟中读取出准确标准时间;不建议修改。

命令示例

1.显示系统的当前时间和日期

1
2
3
timedatectl
# timedatectl status
# 两条命令效果等同

2.设置日期与时间

1
2
3
timedatectl set-time "YYYY-MM-DD HH:MM:SS"
timedatectl set-time "YYYY-MM-DD"
timedatectl set-time "HH:MM:SS"

3.查看所有可用的时区

1
2
3
timedatectl list-timezones
# 亚洲
timedatectl list-timezones | grep -E "Asia/S.*"

4.设置时区

1
timedatectl set-timezone Asia/Shanghai

5.设置硬件时间

1
2
3
4
# 硬件时间默认为UTC
timedatectl set-local-rtc 1
# hwclock --systohc --localtime
# 两条命令效果等同

6.启用时间同步

1
2
timedatectl set-ntp yes
# yes或no; 1或0也可以

参考:CentOS 7 下关于时间和日期以及时间同步的应用

Enjoy it ! Donate me ! 欣赏此文 ! 求鼓励,求支持 !