概述
最近总结了几个开发和安全方面基础的小技巧,账号安全问题一直不能得到足够的重视,会造成后面开发和管理上的困难,下面介绍Basic Auth、Linux用户的管理和ssh免密登录三个知识点。
Basic Auth
Basic Auth,也称为 HTTP 基本认证(HTTP Basic Authentication),是一种用于 HTTP 协议的简单认证机制,HTTP 基本认证由互联网工程任务组(IETF)在 RFC 7617 中定义。在 Basic Auth 中,客户端在发送请求时,将用户名和密码以 Base64 编码的形式包含在请求头的 Authorization 字段中发送给服务器,服务器收到请求后,会解码 Authorization 字段并验证用户名和密码。
Basic Auth 的工作原理
1、客户端请求:当客户端访问一个保护的资源时,如果没有提供认证信息,服务器会返回一个 401 Unauthorized 状态和一个 WWW-Authenticate 响应头,指示客户端需要通过何种认证机制进行认证。
2、编码认证信息: 客户端收到 401 响应后,会提示用户输入用户名和密码。然后,客户端将用户名和密码以 username:password 的形式拼接成一个字符串,再将这个字符串通过 Base64 编码方式编码成一个编码字符串。
3、发送认证请求:编码后的字符串被置于 HTTP 的 Authorization 请求头中并重新发送请求,其中 [encoded_string] 是 Base64 编码后的字符串。
bash
Authorization: Basic [encoded_string]
4、服务器认证:服务器接收到包含认证信息的请求后,解码 Base64 编码字符串,提取用户名和密码,然后验证这些凭据。如果认证通过,则服务器会处理请求并返回所请求的资源。如果认证失败,它可以再次返回 401 状态码。
技术落地
关于Basic Auth的操作非常简单,需要安装工具包,在Nginx配置一下即可,分为2步完成:
1、安装工具包: 安装需要的工具包httpd-tools
,加密文件路径/auth/basic/basicfile
,stark
是登录用户名,会输入密码和重复确认:
bash
sudo yum install httpd-tools
#/auth/basic/basicfile 密码文件
#stark 登录用户名
htpasswd -c /auth/basic/basicfile stark
New password:
Re-type new password:
2、配置Nginx模块
需要配置的是auth_basic、auth_basic_user_file
模块,需要注意的是Context中规定的是设置区域,附带了Nginx 官方文档地址 nginx.org/en/docs/htt...
bash
http {
auth_basic "Restricted Area";
auth_basic_user_file /auth/basic/basicfile;
//...
}
bash
Syntax: auth_basic string | off;
Default:auth_basic off;
Context:http, server, location, limit_except
Syntax: auth_basic_user_file file;
Default:---
Context:http, server, location, limit_except
Linux用户
在实际开发中,不推荐直接使用root来直接操作操作,用户权限遵循最小权限原则,新增一个开发用户来管理,下面我将以新增一个名为stark的用户作为演示,把stark这个用户添加进www组,这个都是Linux操作上最常用的操作。
1.创建账号、设置密码
bash
# 创建账号、设置密码
sudo adduser stark
sudo passwd stark
Changing password for user stark.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
2.把stark 添加到 www组内
bash
sudo usermod -a -G www stark
3.删除stark账号 -r删除家目录和缓存
bash
sudo userdel -r stark
Mysql用户管理
创建用户和赋权
mysql5.7 创建一个用户,用户名是stark,host是%,权限是对spaces库有增删改查权限,下面是执行的sql语句,我Demo里的密码是spaces@2024@$1-9&^(
:
sql
CREATE USER 'stark'@'%';
ALTER USER 'stark'@'%' IDENTIFIED BY 'spaces@2024@$1-9&^(';
GRANT SELECT, INSERT, UPDATE, DELETE ON spaces.* TO 'stark'@'%';
FLUSH PRIVILEGES;
mysql 5.7 回收用户stark对spaces数据库的 delete 权限,下面是sql语句:
sql
REVOKE DELETE ON spaces.* FROM 'stark'@'%';
FLUSH PRIVILEGES;
mysql5.7 创建一个角色app_dev 角色对spaces库所有表都有增删改查权限 创建用户zcc 赋予角色app_dev。
sql
-- 创建角色
CREATE ROLE app_developer;
-- 赋予角色对 spaces 库所有表的增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON spaces.* TO 'app_dev';
-- 创建用户
CREATE USER 'zcc'@'%';
-- 赋予用户角色
GRANT 'app_dev' TO 'zcc'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
ssh免密登录
在Linux系统中,可以设置ssh的免密操作,是一个很好用的功能,设置SSH免密登录主要通过生成SSH密钥对(包括公钥和私钥),并将公钥部署到远程服务器的~/.ssh/authorized_keys文件中来实现。以下是详细的步骤:
1. 在本地机器上生成SSH密钥对:打开终端(Terminal)并运行以下命令来生成SSH密钥对(如果已存在密钥对,可以选择重新生成或跳过此步骤):
bash
ssh-keygen -t rsa -b 4096 -C "你的账号"
-t rsa 表示密钥类型为RSA。 -b 4096 表示密钥的位数为4096位,这可以提高安全性。 -C "your_email@example.com" 是可选的,用于给密钥添加一个注释。
系统会提示你保存密钥的位置(默认是~/.ssh/id_rsa)和设置密钥的密码(passphrase),为了免密登录,可以留空密码,一直回车就可以了
2. 将公钥复制到远程服务器: 如果你的系统中安装了ssh-copy-id命令,可以直接使用它来将公钥复制到远程服务器的~/.ssh/authorized_keys文件中。运行以下命令:
bash
ssh-copy-id user@remotehost
将user替换为你的远程服务器用户名,将remotehost替换为远程服务器的IP地址或域名。
手动复制公钥,把本地公钥你可以手动复制公钥。首先,查看公钥内容:
bash
cat ~/.ssh/id_rsa.pub
或者,你也可以在本地机器上编辑~/.ssh/authorized_keys文件,然后将其传输到远程服务器(注意权限和安全性)。
3. 调整远程服务器的SSH配置 :确保远程服务器的SSH配置允许公钥认证。通常,/etc/ssh/sshd_config
文件中应该包含以下行:
bash
PubkeyAuthentication yes
4. 重启SSH服务(如果更改了配置文件):如果你在远程服务器上修改了sshd_config文件,需要重启SSH服务来使更改生效。
bash
sudo systemctl restart sshd
# 或者
sudo service ssh restart
# 或者
sudo /etc/init.d/ssh restart
5.测试免密登录:现在,你可以尝试从本地机器SSH登录到远程服务器,而不输入密码:
bash
ssh user@remotehost
总结
还有一些知识点,等有时间再一起整理吧。