Linode配置HTTPs和Nginx
Linode 系统版本为:Ubuntu 16.04.5 LTS
Server基本配置
- 查看Ubuntu版本号:
cat /etc/issue
- 查看Ubuntu自带的package:
cat /etc/apt/sources.list
- 检查并更新package:
apt-get upgrade&apt-get update
- 删除不需要的package:
sudo apt-get autoremove
- 设置hostname:
hostnamectl set-hostname example_hostname
- host文件在
/etc/hosts
- 关于host的命名: Using Your System’s hosts File
- Ubuntu package list
- Install finger:
sudo apt install finger
,用户管理插件
#查看当前users
xt@linode:~$ finger
Login Name Tty Idle Login Time Office Office Phone
xt Xu Tao pts/0 Aug 6 11:00 (198.24.30.144)
#查看某个user
xt@linode:~$ finger xt
Login: xt Name: Xu Tao
Directory: /home/xt Shell: /bin/bash
On since Mon Aug 6 11:00 (EDT) on pts/0 from 198.24.30.144
No mail.
No Plan.
所有用户信息保存在/etc/passwd
下面,格式为
username:password:UID:GID:UID info:home directory:command/shell
username | the user’s login name |
password | the password, will simply be an x if it’s encrypted |
user ID (UID) | the user’s ID number in the system. 0 is root, 1-99 are for predefined users, and 100-999 are for other system accounts |
group ID (GID) | Primary group ID, stored in /etc/group. |
user ID info | Metadata about the user; phone, email, name, etc. |
home directory | Where the user is sent upon login. Generally /home/ |
command/shell | The absolute path of a command or shell (usually /bin/bash). Does not have to be a shell though! |
添加用户
- 在/home下创建用户bob:
%adduser bob
- 为bob赋予sudo权限:
%gpasswd -a bob sudo
- 查看哪些用户有sudo权限
%sudo cat /etc/sudoers
%sudo ls /etc/sudoers.d
- 令用户密码过期:
%sudo passwd -e bob
- 退出server:
%exit
配置RSA秘钥
- 用bob登录:
ssh bob@123.456.78.9
-
创建空的rsa key:
$cd ~/ $mkdir .ssh $chmod 700 .ssh` #保存空的rsa key $vim .ssh/authorized_keys
- 上传本地RSA公钥:
%scp ./id_rsa bob@123.456.78.9:~/
- 替换authorized_keys:
%mv id_rsa.pub .ssh/authorized_keys
- 限制权限:
%chmod 644 .ssh/authorized_keys
- 重新用bob登录验证:
%ssh bob@123.456.78.9
- 验证成功后,关掉用户名密码登录
%sudo vim /etc/ssh/sshd_config
- 修改
PasswordAuthentication
为NO
配置SSH
- 修改ssh配置文件:
%sudo vim /etc/ssh/sshd_config
- 修改ssh默认端口22:
Port 445
,可选 - 禁止root登录:
PermitRootLogin no
- 更新ssh配置:
%sudo service ssh restart
- 重新登录:
ssh -p 445 bob@123.456.78.9
- 修改了ssh的登录端口后,scp命令也要加上端口号:
scp -P 445 a.zip bob@123.456.78.9:~/
配置Firewall
- ubuntu自带防火墙工具
ufw
- 查看
ufw
状态:%sudo ufw status
- 打开ssh
sudo ufw allow ssh
- 如果修改了ssh port,需要指定端口号:
sudo ufw allow 4444/tcp
- 打开HTTP,SSL/TLS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
- 查看ufw规则:
sudo ufw show added
- 开启ufw:
sudo ufw enable
- 关闭ssh:
sudo ufw disable
配置Fail2Ban
- 安装fail2ban:
apt-get install fail2ban
- 配置
jail.conf
,修改要创建jail.local
:cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- 修改一些简单配置,比如重试时间,次数,开启
[sshd]
和nginx
配置等 - 更新fail2ban配置:
sudo fail2ban-client reload
- 查看fail2ban状态:
sudo fail2ban-client status
- 更多 Fail2Ban
配置 DNS
将linode提供给的name server关联到域名提供商(如godaday),24~48小时生效
配置 Nginx
- install nginx:
sudo apt-get update
sudo apt-get install nginx
sudo service nginx start
- 配置fail2ban
- 找到
[nginx-http-auth]
, 增加enabled=true
- 找到
- 关于Nginx更详细配置,参考之后的文章
配置HTTPs
这里使用目前还免费的Let’s Encrypt来配置HTTPs
- 暂停nginx:
sudo service stop nginx
-
Install Let’s Encrypt:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
- Obtain a certificate
cd /opt/letsencrypt
./letencrypt-auto certonly --standalone
- 输入域名
abc.com www.abc.com
- 查看钥证书路径
sudo ls /etc/letsencrypt/live/abc.com
- 重要的两个证书
fullchain.pem
privkey.pem
使用Certbot管理证书
Certbot是一个HTTPs证书管理工具,和Let’s Encrypt搭配使用非常方便。可参考官方文档,执行下面命令
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-nginx
Certbot提供对Nginx的支持,会自动修改Nginx的配置文件,修改内容有两部分,一部分是指定SSL的私钥证书,另一部分是对HTTP的请求进行301重定向到HTTPs端口
#etc/nginx/nginx.conf
ssl_certificate /.../abc.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /.../abc.com/privkey.pem; # managed by Certbot
....
if ($host = www.xta0.me) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = xta0.me) {
return 301 https://$host$request_uri;
} # managed by Certbot
...
证书配置好之后重启Nginx,访问域名测试HTTPs是否安装成功。
$sudo service nginx restart
证书更新
SSL证书需要定期更新,certbot
提供了更新证书的命令,手动更新可直接运行sudo certbot renew
。当然我们希望可以自动更新证书,此时需要配置Linux定时任务crontab。crontab的配置文件目录为/var/spool/cron/crontabs
,每个用户都有一份自己的定时任务配置文件。由于这里是要配置SSL证书,需要使用Root权限,因此建议编辑root的crontab:
$sudo su
$crontab -e #编辑crontab
在配置文件中添加下面命令,
#check SSL cert every Monday at 2:30 am
30 2 * * 3 certbot renew --post-hook "service nginx restart" >> /var/log/crontab-cert.log
该命令会在每周三凌晨2点半检查证书是否过期,如果过期则自动更新,成功后执行--post-hook
后的命令,重启nginx。默认情况下Let’s encrpyt会log日志,路径为/var/log/letsencrypt
,我们也可以重定向日志到自定义文件中,方便查阅。编译完成后,需要令定时任务生效,可执行下面命令
$sudo service cron reload
$sudo service cron restart
$sudo service cron status