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
  • 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
    • 修改PasswordAuthenticationNO

配置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.localcp /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

  1. 暂停nginx: sudo service stop nginx
  2. Install Let’s Encrypt:

     sudo git clone https://github.com/letsencrypt/letsencrypt 
     /opt/letsencrypt
    
  3. Obtain a certificate
    • cd /opt/letsencrypt
    • ./letencrypt-auto certonly --standalone
  4. 输入域名
    • abc.com www.abc.com
  5. 查看钥证书路径
    • 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

Resources