1、购买一个阿里云服务
2、设置密码便于ssh登录
3、修改安全属性,配置端口
如果您使用的是来自第三方提供商的虚拟服务器,则在创建服务器时会为其提供IP地址。您可以使用以下命令打开与全新服务器的终端会话:
$ ssh root@<server-ip-address>
系统将提示您输入密码。根据服务的不同,创建服务器后,密码可能会自动生成并显示给您,或者您可以选择自己的密码。
如果使用的是Vagrant VM,则可以使用以下命令打开终端会话:
$ vagrant ssh
如果使用Windows并具有Vagrant VM,请注意,您将需要从可以ssh从OpenSSH 调用命令的外壳程序运行上述命令
使用名为的非root用户帐户ubuntu,而无需密码登录,赋予用户sudo权限并最终切换到该用户。
$ adduser --gecos "" ubuntu
$ usermod -aG sudo ubuntu
$ su ubuntu
检查〜/ .ssh目录的内容:
$ ls ~/.ssh
id_rsa id_rsa.pub
如果目录清单显示的文件名为id_rsa和id_rsa.pub,如上,则您已经有了一个密钥。如果没有这两个文件,或者根本没有〜/ .ssh目录,则需要通过运行以下命令(也是OpenSSH工具集的一部分)来创建SSH密钥对:
$ ssh-keygen
此应用程序将提示您输入一些内容,我建议您通过在所有提示上按Enter接受默认值。如果您知道自己在做什么,而又想做其他事情,您当然可以。
运行此命令后,您应该具有上面列出的两个文件。文件id_rsa.pub是您的公共密钥,它是您将提供给第三方以识别您身份的文件。该id_rsa文件是你的私钥,不应与任何人共享。
现在,您需要将公钥配置为服务器中的授权主机。在您自己的计算机上打开的终端上,将公共密钥打印到屏幕上:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjw....F8Xv4f/0+7WT miguel@miguelspc
这将是一个非常长的字符序列,可能跨越多行。您需要将此数据复制到剪贴板,然后切换回远程服务器上的终端,在该终端上您将发出以下命令来存储公钥:
$ echo <paste-your-key-here> >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
无密码登录现在应该可以正常工作了。这个想法是,ssh您的机器上的机器将通过执行需要私钥的加密操作来向服务器标识自己。然后,服务器使用您的公共密钥验证该操作是否有效。
现在,您可以注销ubuntu会话,然后从会话中注销root,然后尝试使用以下方法直接登录到该ubuntu帐户:
$ ssh ubuntu@<server-ip-address>
这次您不必输入密码!
为了最大程度地减少服务器受到威胁的风险,您可以采取一些步骤,直接关闭许多潜在的门,攻击者可以通过这些门进行访问。
我要进行的第一个更改是通过SSH禁用root登录。现在ubuntu,您可以对该帐户进行sudo无密码访问,并且可以通过来从该帐户运行管理员命令,因此实际上不需要公开根帐户。要禁用root登录,您需要在服务器上编辑/ etc / ssh / sshd_config文件。您可能已在服务器中安装了vi和nano文本编辑器,可用于编辑文件(如果您不熟悉任何一个,请先尝试nano)。您将需要在编辑器前面加上前缀sudo,因为SSH用户无法使用SSH配置sudo vi /etc/ssh/sshd_config。您需要在此文件中更改一行:
/ etc / ssh / sshd_config:禁用root登录。
PermitRootLogin no
请注意,要进行此更改,您需要找到以开头的行,PermitRootLogin并将服务器中可能存在的值更改为no。
下一个更改在同一文件中。现在,我将禁用所有帐户的密码登录。您已设置了无密码登录名,因此根本不需要允许密码。如果您对完全禁用密码感到紧张,可以跳过此更改,但是对于生产服务器,这是一个不错的主意,因为攻击者一直在尝试在所有服务器上使用随机帐户名和密码,以期获得幸运。要禁用密码登录,请在/ etc / ssh / sshd_config中更改以下行:
/ etc / ssh / sshd_config:禁用密码登录。
PasswordAuthentication no
完成SSH配置的编辑后,需要重新启动服务以使更改生效:
$ sudo service ssh restart
我要进行的第三项更改是安装防火墙。这是一个阻止未明确启用的端口上的服务器访问的软件:
$ sudo apt-get install -y ufw
$ sudo ufw allow ssh
$ sudo ufw allow http
$ sudo ufw allow 443/tcp
$ sudo ufw --force enable
$ sudo ufw status
这些命令将安装ufw(非复杂防火墙),并将其配置为仅允许端口22(ssh),80(http)和443(https)上的外部流量。不允许使用任何其他端口。
$ sudo apt-get -y update
$ sudo apt-get -y install python3 python3-venv python3-dev
$ sudo apt-get -y install mysql-server postfix supervisor nginx git
$ git clone https://github.com/miguelgrinberg/microblog
$ cd microblog
$ git checkout v0.17
激活虚拟环境,安装flask组件
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt
安装mysql、gunicorn
(venv) $ pip install gunicorn pymysql
创建一个.env文件,保存环境变量/home/ubuntu/microblog/.env
SECRET_KEY=52cb883e323b48d78a0a36e8e951ba4a
MAIL_SERVER=localhost
MAIL_PORT=25
DATABASE_URL=mysql+pymysql://microblog:-password>@localhost:3306/microblog
MS_TRANSLATOR_KEY=-translator-key-here>
我需要将FLASK_APP环境变量设置为应用程序的入口点,以使flask命令起作用,但是在解析.env文件之前需要此变量,因此需要手动设置。为了避免每次都要设置它,我将其添加到该帐户的〜/ .profile文件的底部ubuntu,以便每次登录时自动对其进行设置:
$ echo "export FLASK_APP=microblog.py" >> ~/.profile
编译语言环境
(venv) $ flask translate compile
需要替换 bash下操作数据库命令 该-b选项告诉gunicorn在哪里侦听请求,我将其设置为端口8000的内部网络接口。通常最好的方法是运行Python Web应用程序而无需外部访问,然后拥有一个经过优化的快速Web服务器来服务静态文件,接受来自客户端的所有请求。这种快速的Web服务器将直接提供静态文件,并将针对该应用程序的所有请求转发到内部服务器。在下一部分中,我将向您展示如何将nginx设置为面向公众的服务器。 该-w选项配置将运行多少名工人。拥有四个工作人员可以使应用程序同时处理多达四个客户端,对于Web应用程序来说,这通常足以处理相当数量的客户端,因为并非所有客户端都在不断请求内容。根据服务器的RAM数量,您可能需要调整工作程序的数量,以免出现内存不足的情况。 该microblog:app参数告诉gunicorn如何加载应用程序实例。冒号之前的名称是包含应用程序的模块,冒号之后的名称是此应用程序的名称。 虽然gunicorn的设置非常简单,但从命令行运行服务器实际上对于生产服务器而言并不是一个好的解决方案。我要做的是让服务器在后台运行,并在不断的监视下进行,因为如果服务器由于某种原因崩溃并退出,我想确保自动启动新服务器来代替它。而且我还想确保如果重新启动计算机,则服务器在启动时会自动运行,而无需我自己登录并自行启动。我将使用上面安装的超级用户软件包来执行此操作。 我希望这是一个安全的部署,因此我将配置端口80以将所有流量转发到将被加密的端口443。因此,我将首先创建一个SSL证书。现在,我将创建一个自签名SSL证书,该证书可以测试所有内容,但不适用于实际部署,因为Web浏览器会警告用户该证书不是由受信任的证书颁发机构颁发的。为微博创建SSL证书的命令为: 上面命令的结果将是两个文件,分别称为key.pem和cert.pem,我将它们放在Microblog根目录的certs子目录中。 删除测试配置文件 / etc / nginx / sites-enabled / microblog:Nginx配置。 重新加载配置 通常,升级不仅比重启服务器还要复杂。您可能需要应用数据库迁移或编译新的语言翻译,因此实际上,执行升级的过程涉及一系列命令:mysql -u root -p
mysql> create database microblog character set utf8 collate utf8_bin;
mysql> create user 'microblog'@'localhost' identified by '<db-password>';
mysql> grant all privileges on microblog.* to 'microblog'@'localhost';
mysql> flush privileges;
mysql> quit;
mysql -uroot -p << EOF
update mysql.user set authentication_string=password('123456') where user='root' ;
update mysql.user set plugin='mysql_native_password' where user='root';
update mysql.user set host = "%" where user = "root";
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
create database if not exists mr;
flush privileges;
EOF
八、配置gunicron和supervisor
(venv) $ gunicorn -b localhost:8000 -w 4 microblog:app
vim /etc/supervisor/conf.d/microblog.conf
[program:microblog]
command=/home/ubuntu/microblog/venv/bin/gunicorn -b localhost:8000 -w 4 microblog:app
directory=/home/ubuntu/microblog
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
$ sudo supervisorctl reload
九、配置nginx
$ mkdir certs
$ openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-keyout certs/key.pem -out certs/cert.pem
$ sudo rm /etc/nginx/sites-enabled/default
server {
# listen on port 80 (http)
listen 80;
server_name _;
location / {
# redirect any requests to the same URL but on https
return 301 https://$host$request_uri;
}
}
server {
# listen on port 443 (https)
listen 443 ssl;
server_name _;
# location of the self-signed SSL certificate
ssl_certificate /home/ubuntu/microblog/certs/cert.pem;
ssl_certificate_key /home/ubuntu/microblog/certs/key.pem;
# write access and error logs to /var/log
access_log /var/log/microblog_access.log;
error_log /var/log/microblog_error.log;
location / {
# forward application requests to the gunicorn server
proxy_pass http://localhost:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
# handle static files directly, without forwarding to the application
alias /home/ubuntu/microblog/app/static;
expires 30d;
}
}
$ sudo service nginx reload
(venv) $ git pull # download the new version
(venv) $ sudo supervisorctl stop microblog # stop the current server
(venv) $ flask db upgrade # upgrade the database
(venv) $ flask translate compile # upgrade the translations
(venv) $ sudo supervisorctl start microblog # start a new server
十、查看结果
netstat -antp