服务器部署篇(一):服务器主机选择及初始化配置 —— 新增用户及密钥对认证

主机

PHP 应用开发好了之后,还需要部署到远程主机上,才能让用户访问我们提供的服务。一般来说,目前市场上提供的主机有四种:共享服务器、虚拟私有服务器(VPS)、专用服务器和 PaaS。每种主机适用场景不同,相应的价格差距也很大。

共享服务器

这种最便宜,一般来说这种适用于非开发者部署网站,比如非程序员出生的站长,部署 WordPress、Discuz 之类的 CMS 网站,不需要懂代码,也不需要配置服务器环境,只需通过 Web 界面操作即可,这种类型的主机资源由很多人共享,存放在不同类目,从安全和性能上来说都很差,而且不允许用户远程登录,支持的软件和扩展有限,不建议开发者使用这种类型的主机。市面上常见的香港主机、美国主机就属于这种服务器。

虚拟私有服务器

虚拟私有服务器就是我们常说的 VPS,这种类型的主机不是物理上的独立主机,而是逻辑上的独立主机,由一些列系统资源组成,分布在多台服务器中,但是拥有自己独立的文件系统、根用户、系统进程和 IP 地址,内存、CPU和带宽是固定的,所以感觉上就是一台独立的主机。我们可以 SSH 远程登录,安装自己需要的软件,对服务器配置进行调优和修改,所以拥有更多的自主性,当然价格也要贵一些。典型代表有 Linode 等。

专用服务器

专用服务器是机架式设备,由主机商代你安装、运行和维护,我们可以根据自己制定的规格配置专用服务器。专用服务器是真实的物理设备,安装、配置和维护成本较高,但是能提供更好的性能,一般大公司如 BAT 都会部署这种类型主机。

PaaS

使用云计算提供的平台即服务(PaaS)能快速发布 PHP 应用,与虚拟私有服务器和专用服务器不同,我们无需管理 PaaS,只需登录 PaaS 提供商的控制面板,点击按钮即可。常见的 PaaS 如下:

  • Amazon AWS
  • 阿里云
  • 百度云
  • 腾讯云
  • Google App Engine
  • Microsoft Azure

各个云计算提供商的价格有所不同,但基本和 VPS 持平。

选择主机方案

我们要根据自己的需求选择合适的主机方案,对于中小型 PHP 应用,使用 VPS 或 PaaS 是最佳选择,目前来说,云计算服务越来越发达,提供的功能越来越丰富,PaaS 是最佳选择。国内的话就阿里云 ECS 了。

设置服务器

首次登录

首先,我们需要登录新买的服务器,在本地设备中打开终端,执行 ssh 命令,登录服务器:

ssh root@your_server_ip_address

这个命令可能会让你确认新服务器的可靠性,输入 yes 并回车即可。

接下来需要输入根用户的密码,一般购买服务器后服务器提供商会给你根用户的密码,输入该密码登录即可。

登录之后,我们可以升级下操作系统的软件:

# Ubuntu
apt-get update;
apt-get upgrade;

# CentOS
yum update

新增用户

我们要创建一个非根用户执行以后的日常操作以提高系统安全性,由于根用户拥有一切权限,所以我们应该尽量避免登录该用户。

下面我们以 Ubuntu 系统为例,演示如何创建新用户 deploy

# 创建用户
adduser deploy
# 让用户拥有sudo权限
usermod -a -G sudo deploy
# 设置用户密码
passwd deploy

对于 CentOS 用户对应操作如下:

# 创建用户
adduser deploy
# 让用户拥有sudo权限
usermod -a -G wheel deploy
# 设置用户密码
passwd deploy

SSH 密钥对认证

创建完新用户后,在本地设备以如下方式登录服务器:

ssh deploy@your_server_ip_address

这个命令需要输入该用户密码后才能登录,我们可以禁用密码登录,以提高系统安全性,密码认证有漏洞,会遭受暴力攻击。对此,我们的解决方案就是使用密钥对认证。

密钥对认证是个复杂的话题,简单来说,我们在本地设备中创建一对「密钥」,其中一个是私钥(保存在本地),另一个是公钥(传到远程服务器),之所以叫密钥对,是因为使用公钥加密的信息只能使用私钥解密。

使用 SSH 密钥对认证方式登录远程服务器时,远程服务器会随机创建一个消息,使用公钥加密,然后把密文发送给本地设备,本地设备收到密文后使用私钥解密,然后把解密后的消息发送给远程服务器,远程服务器验证解密消息后,再授予访问远程服务器的权限。

需要指出的是,如果是多台电脑需要登录远程服务器,这或许不是最好的方式,因为需要在每台电脑中生成 SSH 密钥对,然后再把每个密钥对中的公钥复制到远程服务器中。这种情况下,最好还是使用安全的密码进行登录。不过,如果只有一台本地电脑访问远程服务器,SSH 密钥对认证是最好的方式。

生成 SSH 密钥对的方式是使用以下指令:

ssh-keygen

然后按照屏幕上显示的内容,按照提示输入所需要的信息。这个命令会在本地创建两个文件:~/.ssh/id_rsa.pub(公钥)和 ~/.ssh/id_rsa(私钥)。私钥应该保存在本地电脑中,而且要保密,公钥必须复制到服务器中,我们可以使用 scp (安全复制)命令复制公钥:

scp ~/.ssh/id_rsa.pub deploy@your_server_ip_address:

注:一定要在末尾加上:符号,这会把公钥复制到远程服务器中 deploy 用户的家目录。

接下来,以 deploy 用户的身份登录远程服务器,登录后,确认 ~/.ssh 目录是否存在,如果不存在,需要执行下面的命令手动创建:

mkdir ~/.ssh

然后执行下面的命令创建 ~/.ssh/authorized_keys 文件:

touch ~/.ssh/authorized_keys

这个文件的内容是一系列允许登录这台远程服务器的公钥。执行下面的命令,把刚上传的公钥添加到 ~/.ssh/authorized_keys 文件中:

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

最后,我们需要修改几个目录和文件的权限,只让 deploy 用户访问 ~/.ssh 目录和 ~/.ssh/authorized_keys 文件:

chown -R deploy:deploy ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

至此,所有工作完成,你可以在本地通过 SSH 密钥对认证登录到这条远程服务器了。

禁用密码,禁止根用户登录

下面我们要禁止所有用户通过密码登录,还要禁止根用户登录。

登录到远程服务器后,打开 SSH 配置文件 /etc/ssh/sshd_config,找到 PasswordAuthentication 设置,将其改为 no;然后,找到 PermitRootLogin 设置,将其改为 no,之后保存改动,执行下面的命令重启 SSH 服务,让改动生效:

# Ubuntu
sudo service ssh restart

# CentOS
sudo systemctl restart sshd.service

服务器的安全是长久任务,需要长期关注,除了以上配置外,还建议安装防火墙。Ubuntu 用户可以使用 UFW,CentOS 用户可以使用 iptables

学院君 has written 680 articles

资深PHP工程师,Laravel学院院长

2 thoughts on “服务器部署篇(一):服务器主机选择及初始化配置 —— 新增用户及密钥对认证

发表评论

标记为*的字段是必填项(邮箱地址不会被公开)

你可以使用这些HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>