一、证书
Ubuntu server 20.04.3 给apache2创建自签名证书
介绍
TLS(传输层安全)及其前身SSL是用于将正常流量包装在受保护的加密包装器中的协议。使用这项技术,服务器可以安全地向其客户端发送信息,而不会被外界拦截或读取其消息。
注意:自签名证书将加密您的服务器和任何客户端之间的通信。但是,由于它不是由 Web 浏览器和操作系统中包含的任何受信任的证书颁发机构签署的,因此用户无法使用该证书来自动验证您的服务器的身份。因此,您的用户在访问您的网站时会看到安全错误。
由于此限制,自签名证书不适用于为公众服务的生产环境。它们通常用于测试或保护单个用户或一小群用户使用的非关键服务,这些用户可以通过备用通信渠道建立对证书有效性的信任。如需更适合生产的证书解决方案,请查看Let’s Encrypt,一个免费的证书颁发机构。
先决条件
- 使用非root 用户、启用 sudo 的用户访问 Ubuntu 20.04 服务器。我们的Ubuntu 20.04 初始服务器设置指南可以向您展示如何创建此帐户。
- 您还需要安装 Apache。
|
|
然后,安装apache2
软件包:
|
|
最后,如果您ufw
设置了防火墙,请打开http
和https
端口:
|
|
步骤1:启用mod_ssl
在我们可以使用任何SSL 证书之前,我们首先必须启用mod_ssl
Apache 模块,它提供对 SSL 加密的支持。
mod_ssl
使用以下a2enmod
命令启用:
|
|
重启Apache激活模块:
|
|
该mod_ssl
模块现已启用并可以使用。
步骤2:创建ssl证书
现在 Apache 已准备好使用加密,我们可以继续生成新的 SSL 证书。该证书将存储有关您站点的一些基本信息,并附带一个允许服务器安全处理加密数据的密钥文件。
我们可以使用以下openssl
命令创建 SSL 密钥和证书文件:
|
|
参数详解:
openssl
:这是用于创建和管理 OpenSSL 证书、密钥和其他文件的命令行工具。req -x509
:这指定我们要使用 X.509 证书签名请求 (CSR) 管理。X.509 是 SSL 和 TLS 遵守的用于密钥和证书管理的公钥基础结构标准。-nodes
:这告诉 OpenSSL 跳过使用密码保护我们的证书的选项。当服务器启动时,我们需要 Apache 能够在没有用户干预的情况下读取文件。密码可以防止这种情况发生,因为我们必须在每次重新启动后输入它。-days 365
:此选项设置证书被视为有效的时间长度。我们在这里设置了一年。许多现代浏览器会拒绝任何有效期超过一年的证书。-newkey rsa:2048
:这指定我们要同时生成新证书和新密钥。我们没有在上一步中创建签署证书所需的密钥,因此我们需要将其与证书一起创建。该rsa:2048
部分告诉它制作一个 2048 位长的 RSA 密钥。-keyout
:这一行告诉 OpenSSL 在哪里放置我们正在创建的生成的私钥文件。-out
:这告诉 OpenSSL 在哪里放置我们正在创建的证书。
最重要的一行是请求Common Name
. 您需要输入用于访问服务器的主机名或服务器的公共 IP。重要的是,此字段与您将放入浏览器地址栏中以访问该站点的任何内容相匹配,因为不匹配会导致更多的安全错误。
完整的提示列表如下所示:
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:[email protected]
您创建的两个文件都将放置在/etc/ssl
.
接下来,我们将更新我们的 Apache 配置以使用新的证书和密钥。
步骤3:配置apache使用ssl
现在我们有了自签名证书和密钥,我们需要更新我们的 Apache 配置以使用它们。在 Ubuntu 上,您可以将新的 Apache 配置文件(它们必须以 结尾.conf
)放入/etc/apache2/sites-available/
,它们将在下次重新加载或重新启动 Apache 进程时加载。
在本教程中,我们将创建一个新的最小配置文件。(如果您已经<Virtualhost>
设置了Apache并且只需要向其中添加 SSL,您可能需要复制以 开头的配置行SSL
,并将VirtualHost
端口从切换80
到443
。我们将80
在下一步中处理端口。 )
在 /etc/apache2/sites-available 目录中打开一个新文件:
|
|
粘贴以下最小的 VirtualHost 配置:
/etc/apache2/sites-available/your_domain_or_ip.conf
|
|
请务必将ServerName
行更新为您打算寻址服务器的任何方式。这可以是主机名、完整域名或 IP 地址。确保您选择的任何内容与Common Name
您在制作证书时选择的内容相匹配。
剩下的几行指定一个DocumentRoot
目录来提供文件,以及将 Apache 指向我们新创建的证书和密钥所需的 SSL 选项。
现在让我们创建我们DocumentRoot
的 HTML 文件并将其放入其中,仅用于测试目的:
|
|
index.html
使用文本编辑器打开一个新文件:
|
|
将以下内容粘贴到空白文件中:
/var/www/your_domain_or_ip/index.html
|
|
当然,这不是一个完整的 HTML 文件,但浏览器很宽松,足以验证我们的配置。
保存并关闭文件
接下来,我们需要使用a2ensite
工具启用配置文件:
|
|
接下来,让我们测试一下配置错误:
|
|
如果一切顺利,您将得到如下所示的结果:
OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this messageSyntax OK
第一行是一条消息,告诉您该ServerName
指令未全局设置。如果你想摆脱那条消息,你可以ServerName
在/etc/apache2/apache2.conf
. 这是可选的,因为该消息不会造成伤害。
如果您的输出包含Syntax OK
在其中,则您的配置文件没有语法错误。我们可以安全地重新加载 Apache 以实现我们的更改:
|
|
现在在浏览器中加载您的站点,确保https://
在开始时使用。
您应该会看到一个错误。这对于自签名证书来说是正常的!浏览器警告您它无法验证服务器的身份,因为我们的证书没有由任何已知的证书颁发机构签署。对于测试目的和个人使用,这可以很好。您应该能够点击进入高级信息或更多信息,然后选择继续。
执行此操作后,您的浏览器将加载该it worked!
消息。
注意:如果您的浏览器根本没有连接到服务器,请确保您的连接没有被防火墙阻止。如果您使用的是ufw
,以下命令将打开端口80
和443
:sudo ufw allow "Apache Full"
复制
接下来,我们将VirtualHost
在我们的配置中添加另一个部分,以提供纯 HTTP 请求并将它们重定向到 HTTPS。
步骤4:将http重定向到https
目前,我们的配置只会响应端口上的 HTTPS 请求443
。80
即使您想强制加密所有流量,也最好在 port 上做出响应。让我们设置一个VirtualHost
来响应这些未加密的请求并将它们重定向到 HTTPS。
打开我们在前面的步骤中启动的同一个 Apache 配置文件:
|
|
在底部,创建另一个VirtualHost
块以匹配端口上的请求80
。使用该ServerName
指令再次匹配您的域名或 IP 地址。然后,用于Redirect
匹配任何请求并将它们发送到 SSL VirtualHost
。确保包含尾部斜杠:
/etc/apache2/sites-available/your_domain_or_ip.conf
|
|
完成后保存并关闭此文件,然后再次测试您的配置语法,并重新加载 Apache:
|
|
您可以通过http://
在地址前面使用纯文本访问您的站点来测试新的重定向功能。您应该会被https://
自动重定向到。
结果:
未重定向前访问http://10.4.7.142
访问:https://10.4.7.142
将请求到http上的流量重定向到https上后访问:http://10.4.7.142 和 https://10.4.7.142
谷歌浏览器f12 security 选项可以查看自建的证书详细信息。
控制台安全
禁用ctrl+alt+delete
任何对键盘有物理访问权限的人都可以简单地使用Ctrl+Alt+Delete组合键来重新启动服务器,而无需登录。虽然有人可以简单地拔掉电源,但您仍应防止在生产服务器上使用此组合键。这迫使攻击者采取更严厉的措施重启服务器,同时防止意外重启。
要禁用通过按Ctrl+Alt+Delete组合键执行的重启操作,请运行以下两个命令:
sudo systemctl mask ctrl-alt-del.target
sudo systemctl daemon-reload
https://multipass.run/?_ga=2.172781731.1854281748.1632272954-1233097571.1631927770
multipass
Ubuntu虚拟机
Multipass是在 Ubuntu 上创建 Ubuntu VM 的推荐方法。它专为希望通过单个命令获得全新 Ubuntu 环境并可在 Linux、Windows 和 macOS 上运行的开发人员而设计。
在 Linux 上,它可以快速使用:
sudo snap install multipass --beta --classic
用法:
查找镜像
|
|
在当前Ubuntu系统中创建新实例
|
|
检查正在运行中的实例
|
|
显示刚才创建实例的详细信息
|
|
进入到刚刚创建实例的系统中
|
|
在刚刚创建的虚拟机外部查看创建的虚拟机的相关信息
|
|
停止刚才创建的实例
|
|
删除实例
|
|
它会显示删除了
|
|
彻底删除
|
|
二、容器
LXD
LXD(发音为 lex-dee)是更轻的管理程序,或轻量级容器管理程序。LXC (lex-see) 是一个在本地系统上创建和管理“容器”的程序。它还提供了一个 API 以允许更高级别的管理器(例如 LXD)管理容器。从某种意义上说,可以将 LXC 与 QEMU 进行比较,同时将 LXD 与 libvirt 进行比较。
LXC API 处理“容器”。LXD API 处理“远程”,它提供图像和容器。这通过网络扩展了 LXC 功能,并允许对容器迁移和容器映像发布等任务进行简洁的管理。
LXD 在幕后使用 LXC 来完成一些容器管理任务。但是,它保留自己的容器配置信息并有自己的约定,因此最好不要将经典的 LXC 命令与 LXD 容器一起使用.
ubuntu server 预装LXD。其他系统可以使用以下命令安装 lxd 包
|
|
配置
lxd 初始化(必须以root身份运行)
|
|
详细参数:
LXD Clustering:不需要 New storage pool:需要创建一个存储池 Name of storage pool:给存储池命名 storage backend:存储后端,使用 ZFS Create a new ZFS pool:需要创建一个 ZFS 池 Use an existing block device:Yes Path to block device:使用已有的磁盘分区用于 ZFS 的存储后端 MAAS server?:不知道是啥,不需要 New local network bridge?:需要,我只需要使用 LXD 默认的网桥即可 New bridge be called:给网桥命名 IPv4:默认 auto IPv6:默认 auto LXD available over the network?:默认 no Stale cached?:默认 yes YAML printed?:打印信息,yes/no 都行
如果不能用root用户,普通用户如lhp 需要加入lxd用户组。
|
|
查看lxd配置信息
|
|
查看默认容器配置
|
|
查看容器列表
|
|
创建容器模板
- 配置清华镜像源
https://mirrors.tuna.tsinghua.edu.cn/help/lxc-images/
LXD/LXC 2.0及以上版本使用镜像加速的方法:
创建一个remote链接,指向镜像站即可,或替换掉默认的images链接。
# lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public
# lxc image list tuna-images:
- 查看镜像列表,寻找合适的镜像的FINGERPRINT,用于下载(注意选择x86_64架构)
|
|
|
|
- FINGERPRINT是镜像的指纹,在上条命令下查找,ContainerTemplateName为容器模板名称,自己定义
|
|
- 举例,创建一个名为ubuntu的容器。在lxc清华源中10c1476cf890是Ubuntu16.04的fingerprint
|
|
- 进行容器列表查看
sudo lxc list
+--------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+--------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| ubuntu | RUNNING | 10.235.54.209 (eth0) | fd42:1082:67cd:27dd:216:3eff:fec0:6ed1 (eth0) | CONTAINER | 0 |
+--------+---------+----------------------+-----------------------------------------------+-----------+-----------+
- 可进入容器的 root 用户下 bash
sudo lxc exec <ContainerTemplateName> bash
- 用户切换
sudo susu ubuntu
配置共享目录
- 设置共享目录来实现宿主机与容器之间的文件传输
- 设置键值
|
|
- 设置共享目录,其中shareName为虚拟的设备名称,lxd会虚拟出该设备并导通接通两者共享目录,path1为宿主机下共享目录路径,path2为容器下共享目录路径
|
|
实例:
|
|
可以在宿主机/media中创建文件测试,容器/share中文件是否存在。
设置用户名密码:
|
|
容器克隆
- 克隆容器 参数一为模板容器名称,参数二为目标容器名称
|
|
- 运行新容器
|
|
- 进入新容器bash
|
|
注意,此步骤后需要修改Frp的端口,重新建立内外网穿透,建议修改后使用snapshot快照备份sudo lxc snapshot <ContainerName>
。
实例:
|
|
|
|
可视化管理
- 下载源码
|
|
- 安装前环境检查
|
|
|
|
- 创建虚拟环境并检查环境
|
|
- 安装LXDUI面板并再次检查环境
|
|
- 启动面板
|
|
- 登录面板http://127.0.0.1:15151,默认账户密码均为admin
参考:https://blog.csdn.net/CrazyBusby/article/details/114886340
https://www.youtube.com/watch?v=Fzb6jN6GYL8&ab_channel=JustmeandOpensource
查看容器日志
要查看有关 LXD 本身的调试信息,请在基于 systemd 的主机上使用
journalctl -u lxd
可以使用以下方式查看容器 c1 的容器日志文件:
lxc info c1 --show-log
创建快照
可以使用以下lxc move
命令重命名和实时迁移容器:
lxc move c1 final-beta
它们也可以被快照:
lxc snapshot c1 YYYY-MM-DD
然后可以通过恢复快照来恢复对 c1 的后续更改:
lxc restore u1 YYYY-MM-DD
也可以通过复制容器或快照来创建新容器:
lxc copy u1/YYYY-MM-DD testcontainer
限制:
LXD 支持灵活限制容器可以消耗的资源。限制分为以下几类:
- CPU:以多种方式限制容器可用的 CPU。
- 磁盘:配置负载下I/O请求的优先级
- RAM:配置内存和交换可用性
- 网络:配置负载下的网络优先级
- 进程数:限制容器中的并发进程数。
lxd 容器端口暴露,使得外面能够访问容器内业务。
前提条件:
lxd容器:Ubuntu
宿主机:Ubuntu
lxd容器内安装apache2 ,并将访问端口更改为8080,重启apache2
|
|
将宿主机的80端口和容器内8080做映射。外部通过访问宿主机的ip+80来访问容器内的业务。
|
|
删除映射
|
|
三、数据库
PostgreSQL
PostgreSQL 是一个对象关系数据库系统,它具有传统商业数据库系统的特性,并在下一代 DBMS 系统中进行了增强。
安装
|
|
配置
要使其他计算机能够连接到您的 PostgreSQL 服务器,请编辑文件 /etc/postgresql/12/main/postgresql.conf
找到*#listen_addresses = ’localhost’ 行*并将其更改为:
|
|
笔记
要同时允许 IPv4 和 IPv6 连接,请将 ’localhost’ 替换为 ‘::’
现在我们可以连接到我们的 PostgreSQL 服务器,下一步是为postgres用户设置密码。在终端提示符下运行以下命令以连接到默认的 PostgreSQL 模板数据库:
sudo -u postgres psql template1
上面的命令以用户postgres连接到 PostgreSQL 数据库template1。连接到 PostgreSQL 服务器后,您将看到 SQL 提示符。您可以在 psql 提示符下运行以下 SQL 命令来配置用户postgres的密码。
ALTER USER postgres with encrypted password 'your_password';
配置密码后,编辑文件/etc/postgresql/12/main/pg_hba.conf
以对postgres用户使用MD5身份验证:
local all postgres md5
最后,您应该重新启动 PostgreSQL 服务以初始化新配置。从终端提示输入以下内容以重新启动 PostgreSQL:
sudo systemctl restart postgresql.service
警告
以上配置无论如何都不完整。更多参数请参考《PostgreSQL 管理员指南》。
您可以使用 PostgreSQL 客户端测试来自其他机器的服务器连接。
sudo apt install postgresql-client
psql -h postgres.example.com -U postgres -W
笔记
将域名替换为您的实际服务器域名。
参考:https://ubuntu.com/server/docs/databases-postgresql
四、监控
集群监控软件
- Prometheus
- Prometheus Alertmanager
- Grafana
- Telegraf
所需端口
Prometheus | monitor:9090 |
---|---|
Alertmanager | monitor:9093 |
Grafana | monitor:3000 |
Telegraf | workload:9273 |
nagios 安装
|
|
五、备份
备份软件:
方案1:bacula
方案2:NFS+shell script + crontab
场景:nfs server :10.4.7.141 共享目录: /mnt/backup
nfs client : 10.4.7.142 新建目录/opt/example 需要与 10.4.7.141的/mnt/backup 目录做绑定。
server:
|
|
配置:
|
|
如果/mnt/backup 不存在先创建该目录。
|
|
配置生效
|
|
client:
安装nfs客户端
|
|
创建目录
|
|
最后需要配置fstab
|
|
备份脚本编写
场景:定时将client中 /home /var/spool/mail /etc /opt 中文件备份到server 的/mnt/backup 中。每天凌晨12:00 备份一次。
backup.sh
|
|
crontab
|
|
从备份中恢复
查看存档内容的列表。从终端提示输入:
tar -tzvf /mnt/backup/host-Monday.tgz
要将文件从存档恢复到不同的目录,请输入:
tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts
tar的*-C*选项将提取的文件重定向到指定的目录。上面的例子将
/etc/hosts
文件解压到/tmp/etc/hosts
. tar 重新创建它包含的目录结构。另外,请注意前导*“/”*不在要恢复的文件路径之外。
要恢复存档中的所有文件,请输入以下内容:
cd /sudo tar -xzvf /mnt/backup/host-Monday.tgz
笔记
这将覆盖当前文件系统上的文件。
六、邮件服务
dovecot
postfix
七、web服务
状态码
1xx : Informational - 收到请求,继续处理
2xx : 成功- 动作被成功接收、理解和接受
3xx : 重定向- 必须采取进一步行动才能完成请求
4xx : 客户端错误- 请求包含错误的语法或无法完成
5xx: 服务器错误- 服务器未能满足明显有效的请求
静态 Web 服务器:服务器响应的内容将是托管文件“原样”。
动态 Web 服务器:由一个 Web 服务器和一个额外的软件组成,通常是一个应用服务器和一个数据库。例如,要生成您在 Web 浏览器中看到的 Web 页面,应用程序服务器可能会用数据库中的内容填充 HTML 模板。因此,我们说服务器响应的内容是动态生成的。
apache2
Apache 是 Linux 系统上最常用的 Web 服务器。Web 服务器用于为客户端计算机请求的网页提供服务。客户端通常使用 Firefox、Opera、Chromium 或 Internet Explorer 等 Web 浏览器应用程序请求和查看网页.
用于传输网页的最常用协议是超文本传输协议 (HTTP)。还支持诸如基于安全套接字层的超文本传输协议 (HTTPS) 和文件传输协议 (FTP)(用于上传和下载文件的协议)等协议。
Apache Web 服务器通常与 MySQL 数据库引擎、超文本预处理器 (PHP) 脚本语言和其他流行的脚本语言(如 Python 和 Perl)结合使用。这种配置被称为 LAMP(Linux、Apache、MySQL 和 Perl/Python/PHP),它为基于 Web 的应用程序的开发和部署形成了一个强大而健壮的平台。
安装
在终端提示符下输入以下命令:
sudo apt install apache2
配置
Apache2 是通过在纯文本配置文件中放置指令来配置的。这些指令在以下文件和目录之间分开:
- apache2.conf:Apache2 的主要配置文件。包含对 Apache2全局的设置。
- httpd.conf:历史上主要的 Apache2 配置文件,以 httpd 守护进程命名。在其他发行版(或旧版本的 Ubuntu)中,该文件可能存在。在 Ubuntu 中,所有配置选项已移至apache2.conf及以下引用目录,该文件不再存在。
- conf-available:该目录包含可用的配置文件。以前在的所有文件
/etc/apache2/conf.d
都应移动到/etc/apache2/conf-available
. - conf-enabled:持有符号链接*到文件
/etc/apache2/conf-available
。当配置文件被符号链接时,它将在下次重新启动 apache2 时启用。 - envvars:设置Apache2环境变量的文件。
- mods-available:此目录包含加载模块和配置它们的配置文件。然而,并非所有模块都有特定的配置文件。
- mods-enabled:持有符号链接到文件
/etc/apache2/mods-available
。当模块配置文件被符号链接时,它将在下次重新启动 apache2 时启用。 - ports.conf:包含确定 Apache2 正在侦听的 TCP 端口的指令。
- sites-available: 此目录包含 Apache2虚拟主机的配置文件。虚拟主机允许为具有单独配置的多个站点配置 Apache2。
- sites-enabled:与mods-enabled一样,
sites-enabled
包含指向/etc/apache2/sites-available
目录的符号链接。类似地,当sites-available 中的配置文件被符号链接时,一旦Apache2 重新启动,由它配置的站点将处于活动状态。 - magic:根据文件的前几个字节确定 MIME 类型的说明。
新建站点或虚拟主机
|
|
最终要访问的域名或IP和/etc/apache2/sites-available/中.conf文件同名
更改默认监听端口在:
|
|
您可能还希望您的站点响应www.mynewsite.com
,因为许多用户会认为 www 前缀是合适的。为此使用ServerAlias指令。您还可以在 ServerAlias 指令中使用通配符。
例如,以下配置将使您的站点响应任何以.mynewsite.com
结尾的域请求。
ServerAlias *.mynewsite.com
默认站点位置:
|
|
示例:将80端口重定向到443端口
/etc/apache2/sites-available/10.4.7.142.conf
|
|
站点主页:
/var/www/10.4.7.142/index.html
|
|
自签名证书需要自行创建:
|
|
开启应用配置:
|
|
禁用站点配置:
|
|
启动ssl模块
|
|
您可以通过https://your_hostname/url/
在浏览器地址栏中键入来访问安全服务器页面。
八、密码管理
root密码忘记重置
重启系统 按F1进入。
重启Ubuntu 在启动界面选择 (高级)-》
选择 recovery mode-》
首先重建GRUB引导,否则改密码可能会出现 Authentication token manipulation error 错误-》
完成后回车,继续选择root,接下来按照提示修改密码就可以。
|
|
修改完成后,重启服务器
|
|
九、ubuntu20.04 进入命令行模式
启动时禁用GUI
|
|
重新启动或退出当前会话以退出GUI:
|
|
恢复图形模式
|
|