文章851
标签121
分类10

堡垒机

1. 什么是堡垒机?

堡垒机(Bastion Host)是一种中间层安全设备,通常用于管理和监控对内部服务器的访问。它起到保护内网的重要作用,允许用户通过堡垒机安全地访问内部资源。

2. 堡垒机的功能

  • 访问控制:限制用户对内部服务器的访问,确保只有授权用户可以访问。
  • 审计与监控:记录用户的操作日志,便于审计和合规检查。
  • 协议代理:支持 SSH、RDP 等协议,提供统一的访问入口。
  • 安全隔离:将外部网络与内部网络隔离,防止直接访问内部资源。

3. 堡垒机的部署方式

3.1 单机部署

适合小型企业或简单场景,直接在一台服务器上部署堡垒机。

3.2 集群部署

适合大型企业,使用多台堡垒机组成集群,提高可用性和负载均衡。

3.3 云服务部署

利用云平台提供的堡垒机服务,快速部署和管理,降低运维成本。

4. 堡垒机的安全策略

  • 强认证机制:使用多因素认证(MFA)增强安全性。
  • 细粒度权限控制:根据用户角色和需求分配最小权限。
  • 定期审计:定期检查访问日志和权限设置,发现并修复安全隐患。

5. 常见堡垒机软件

  • JumpCloud
  • OpenSSH
  • Apache Guacamole
  • CyberArk

6. 使用堡垒机的最佳实践

  • 定期更新:保持堡垒机及其软件的最新状态,以防止安全漏洞。
  • 监控和告警:设置监控和告警机制,及时发现异常活动。
  • 用户培训:定期对用户进行安全培训,提高安全意识。

MySQL 的 `sql_mode` 合理设置

sql_mode 是 MySQL 中一个非常重要的系统变量,用于定义 SQL 语句的执行模式。合理设置 sql_mode 可以帮助确保数据完整性和一致性,同时可以避免一些潜在的问题。以下是关于 sql_mode 的详细介绍及其合理设置建议。

1. sql_mode 的作用

sql_mode 影响 MySQL 的行为,特定的 SQL 模式可以启用或禁用某些功能和限制,比如:

  • 数据验证和完整性检查
  • 日期和时间处理
  • 错误处理方式

2. 常用的 sql_mode

以下是一些常见的 sql_mode 值及其含义:

  • STRICT_TRANS_TABLES: 在事务表中,插入或更新无效数据时会产生错误,而不是警告。
  • NO_ZERO_IN_DATE: 禁止日期中的零部分(如 0000-00-00)。
  • NO_ZERO_DATE: 禁止 DATE 类型为零日期。
  • ERROR_FOR_DIVISION_BY_ZERO: 在除以零的情况下产生错误。
  • ONLY_FULL_GROUP_BY: 在 GROUP BY 语句中,所有选择的列必须在 GROUP BY 中列出,或者使用聚合函数。
  • ANSI_QUOTES: 支持 ANSI 引号,用于标识符。

3. 查看当前 sql_mode

要查看当前数据库的 sql_mode 设置,可以使用以下命令:

SELECT @@sql_mode;

4. 设置 sql_mode

4.1 临时设置

可以在会话中临时更改 sql_mode

SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE';

4.2 永久设置

要永久更改 sql_mode,需要在 MySQL 配置文件中进行修改(通常是 my.cnfmy.ini)。在 [mysqld] 部分添加:

[mysqld]
sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY'

然后重启 MySQL 服务以使更改生效。

5. 建议的合理设置

以下是一些合理的 sql_mode 设置建议:

  • 开发环境: 可能希望使用较宽松的模式,便于调试和开发。例如,可以设置为:

    SET SESSION sql_mode = '';
  • 生产环境: 建议使用更严格的模式,确保数据的完整性和一致性:

    SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,ONLY_FULL_GROUP_BY';

6. 兼容性考虑

在更改 sql_mode 时,注意以下几点:

  • 某些应用程序可能依赖于特定的 SQL 行为,调整 sql_mode 可能会导致不兼容。
  • 在大规模的生产环境中,建议在测试环境中充分测试后再应用更改。

Docker 常用操作

Docker 是一个开源的应用容器引擎,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 操作命令和基本使用技巧。

1. 安装 Docker

在不同平台上安装 Docker 的步骤略有不同,以下是常见平台的安装步骤。

1.1 Ubuntu

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

1.2 CentOS

sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker

1.3 Windows 和 macOS

访问 Docker 官网 下载并安装 Docker Desktop。

2. 基本命令

2.1 查看 Docker 版本

docker --version

2.2 查看运行中的容器

docker ps

2.3 查看所有容器(包括停止的)

docker ps -a

2.4 创建并运行容器

docker run -d --name my_container nginx

2.5 停止容器

docker stop my_container

2.6 启动容器

docker start my_container

2.7 删除容器

docker rm my_container

2.8 查看镜像

docker images

2.9 拉取镜像

docker pull nginx

2.10 删除镜像

docker rmi nginx

3. 容器操作

3.1 进入容器

docker exec -it my_container /bin/bash

3.2 查看容器日志

docker logs my_container

3.3 复制文件到容器

docker cp /path/to/local/file my_container:/path/in/container

3.4 复制文件从容器到本地

docker cp my_container:/path/in/container /path/to/local/directory

4. 网络操作

4.1 查看网络

docker network ls

4.2 创建网络

docker network create my_network

4.3 连接容器到网络

docker network connect my_network my_container

4.4 断开容器与网络的连接

docker network disconnect my_network my_container

5. Docker Compose

5.1 安装 Docker Compose

使用以下命令安装 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

5.2 创建 docker-compose.yml 文件

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"

5.3 启动服务

docker-compose up -d

5.4 停止服务

docker-compose down

6. 其他常用命令

6.1 清理未使用的镜像和容器

docker system prune

6.2 查看 Docker 资源使用情况

docker stats

MySQL 字符串截取

在 MySQL 中,字符串截取可以通过多种函数来实现。以下是一些常见的字符串截取方法及其用法。

1. 使用 SUBSTRING() 函数

SUBSTRING() 函数用于从指定位置开始截取字符串。

1.1 语法

SUBSTRING(str, start, length)
  • str: 要截取的字符串。
  • start: 开始位置(从 1 开始)。
  • length: 要截取的长度(可选)。

1.2 示例

SELECT SUBSTRING('Hello, World!', 1, 5);  -- 输出 'Hello'
SELECT SUBSTRING('Hello, World!', 8);     -- 输出 'World!'

2. 使用 LEFT() 函数

LEFT() 函数用于从字符串的左侧开始截取指定长度的字符串。

2.1 语法

LEFT(str, length)

2.2 示例

SELECT LEFT('Hello, World!', 5);  -- 输出 'Hello'

3. 使用 RIGHT() 函数

RIGHT() 函数用于从字符串的右侧开始截取指定长度的字符串。

3.1 语法

RIGHT(str, length)

3.2 示例

SELECT RIGHT('Hello, World!', 6);  -- 输出 'World!'

4. 使用 SUBSTRING_INDEX() 函数

SUBSTRING_INDEX() 函数用于根据指定的分隔符截取字符串。

4.1 语法

SUBSTRING_INDEX(str, delimiter, count)
  • count: 如果为正,返回从字符串开始到指定分隔符的部分;如果为负,返回从字符串末尾到指定分隔符的部分。

4.2 示例

SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 2);  -- 输出 'apple,banana'
SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1); -- 输出 'cherry'

5. 使用 INSTR()SUBSTRING()

结合使用 INSTR()SUBSTRING() 可以实现更复杂的字符串截取。

5.1 示例

从某个特定字符开始截取:

SELECT SUBSTRING('Hello, World!', INSTR('Hello, World!', ',') + 1);  -- 输出 ' World!'

PHP 精度进位方法

精度处理 函数 进位/取整方法

<?php
/**
 * File Name: test.php
 * Author: len
 * Mail: i@91coder.org
 * Created Time: Wed Sep 18 14:48:47 2019
 */

function priceTool($price, $pricePrecision, $isCarry = false)
{
    list($int, $float) = explode('.', $price);

    if (!$isCarry) return bcadd($price, 0, $pricePrecision);

    $float = rtrim($float, '0');
    if (!$float) {
        return bcadd($price, 0, $pricePrecision);
    }

    $len = $pricePrecision - strlen($float);
    if ($len < 0) {
        $float = '1' . substr($float, 0, $pricePrecision);
        $float = substr(strval(++$float), 1, $pricePrecision);
    } else {
        $float = $float . str_repeat('0', $len);
    }

    return implode('.', [$int, $float]);
}

echo priceTool('20.123', 2, true), PHP_EOL;

亲测有效 , 方法不是最优 还请见谅

">