PHP 服务器主机选择及初始化配置 —— 新增用户及密钥对认证
主机
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
选择主机方案
我们要根据自己的需求选择合适的主机方案,对于中小型 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
。
2 Comments