使用Packer基于Azure云创建包含CIS安全加固的自定义镜像

前言

目前公有云市场上的镜像,都是别人已经定义好的(无论是公有云原生提供还是第三方供应商),部分系统配置和版本不适配所有项目,特别是一些需要自定义镜像需求的企业;

同时又由于人工制作一个镜像成本较大,且不容易修改更新,所以我们需要有一个流水线方式的流程来生成镜像,Packer刚好符合我们的需求

Packer是一个轻量级的开源工具,用于为常用的操作系统(如Windows、Linux)创建镜像,同时它也能支持多种云(AWS,Azure,阿里云等),本文实验步骤基于Azure云创建自定义镜像

黄金镜像

Offical Image: 官方的镜像

Base Image: 我们使用官方的镜像作为我们的基础镜像,上传至云平台

Golden Image: 基于Base Image安装系统基线配置和应用软件,我们定义为黄金镜像Golden Image

为什么我们要生成这样的Golden Image?

Golden Image 是一种提高系统部署、管理和维护效率的有效方法。通过预先配置和验证系统,可以确保部署的环境是一致的、可靠的,并且符合组织的标准和最佳实践

创建 Golden Image(黄金镜像)是一种在 IT 管理和部署中常见的实践,有多个原因可以解释为什么需要制作 Golden Image:

  1. 一致性和可重复性: Golden Image 确保环境的一致性,因为它是一个经过配置和测试的标准化镜像。使用 Golden Image 可以确保在不同的环境中部署相同的基础设施,提供可重复的结果。

  2. 快速部署: Golden Image 包含了操作系统、应用程序和配置的预先安装,使得部署新系统或应用程序非常快速。这对于需要在大量机器上部署相似配置的场景非常有用。

  3. 配置管理: Golden Image 包含了已经配置和验证的设置,包括操作系统设置、安全配置、应用程序配置等。这确保了所有部署的系统都符合相同的标准。

  4. 可靠性和稳定性: 由于 Golden Image 是经过测试和验证的,因此它通常更加可靠和稳定。这减少了在生产环境中遇到问题的可能性。

  5. 安全性: 制作 Golden Image 时可以执行各种安全性操作,例如关闭不必要的服务、应用最新的补丁和安全配置。这有助于减少系统的潜在漏洞。

  6. 容易更新: 当需要对环境进行更新时,可以更新 Golden Image,然后重新部署。这比逐个更新每个服务器要更为高效。

  7. 支持版本控制: Golden Image 可以与版本控制系统集成,允许在环境中轻松管理和跟踪不同版本的镜像。

架构设计

架构说明:

  • 开发人员会将代码推送到代码仓库
  • 代码仓库存放puppet代码和Packer流水线代码
  • 流水线通过Gitlab runner触发执行,每次推送代码都会自动触发CICD
  • Gitlab runner部署在云环境的VM上,所有流水线任务由runner执行,并将在云环境上生成最终的黄金镜像
  • Packer部署在runner服务器上

CIS集成设计

下图是Packer相关组件的说明,我们会在Provisioners执行Shell/Powershell脚本,以执行操作系统中的命令,这时候我们就可以将CIS中要求的系统配置生成到我们最终的黄金镜像

CIS模块说明

cis是做什么的?目前支持puppet已完成的基线?包含redhat/suse;提供基线清单

CIS标准


CIS标准指的是由互联网安全中心(Center for Internet Security,简称CIS)制定的安全基准。这些基准是一系列详细的安全配置指南,旨在帮助组织确保其信息技术系统的安全性,以降低遭受网络攻击和数据泄露的风险。

Puppet模块会影响什么

该模块涉及:

1、初始化构筑

1.1 文件系统

  1.1.1 文件系统内核模块

  1.1.2 配置文件系统分区

1.2 配置软件和补丁管理

1.3 配置启动参数

1.4 配置额外的进程加固

1.5 强制权限控制

  1.5.1 配置Selinux

1.6 配置系统范围的加密策略

1.7 配置命令行警告标志

2、服务

2.1 配置时间同步

2.2 配置特殊性服务及客户端

3、网络

3.1 配置网络设备

3.2 配置网络内核模块

3.3 配置网络内核参数

3.4 配置主机基础防火墙

4、访问认证和授权

4.1 配置计划任务

4.2 配置SSH服务

4.3 配置权限升级

4.4 配置认证模块

4.5 用户账号和环境

5、日志和审计

5.1 日志服务

5.2 审计服务

6、系统维护

6.1 系统文件权限

目前我们的puppet模块现已支持Redhat 8和Suse 15操作系统

感兴趣的可以联系我们,提供相关代码模块

主要特点

  1. 自动化配置:CIS模块提供了一种自动化的方法来应用CIS基准中的安全配置。通过使用这些模块,可以快速、轻松地将系统配置为符合CIS的安全要求,而无需手动配置每个安全设置。

  2. 可定制性:CIS模块通常提供了多个级别的安全配置(模块清单文件中设置了4个配置级别),以满足不同组织和环境的需求。可以根据自身情况选择合适的安全级别,并进行必要的定制化设置。

  3. 跨平台支持:CIS模块通常覆盖了各种操作系统平台,包括但不限于Linux、Windows、Unix等。这使得可以在不同的环境中使用相同的工具来管理系统的安全性。

模块依赖

Puppet版本:8.3.1

需要加载的依赖模块

puppet module install saz-timezone --version 6.3.0

puppet module install puppet-windowsfeature --version 4.0.0

puppet module install puppetlabs-registry --version 5.0.1

puppet module install puppetlabs-powershell --version 6.0.0

puppet module install puppetlabs-pwshlib --version 1.0.1

puppet module install jpi-timezone_win --version 0.1.6

puppet module install puppetlabs-stdlib --version 9.4.1

puppet module install thias-sysctl --version 1.0.7

puppet module install ghoneycutt-pam --version 5.0.0

puppet module install simp-simplib --version 4.12.1

puppet module install puppet-augeasproviders_pam --version 4.0.0

puppet module install puppet-augeasproviders_core --version 4.1.0

puppet module install puppet-augeasproviders_grub --version 5.1.0

puppet module install puppetlabs-reboot --version 5.0.0

puppet module install puppet-kmod --version 4.0.1

puppet module install puppetlabs-inifile --version 6.1.0

puppet module install puppetlabs-chocolatey --version 8.0.0

puppet module install puppetlabs-augeas_core --version 1.4.1

puppet module install puppetlabs-ruby_task_helper --version 0.6.1

puppet module install puppet-cron --version 4.1.0

puppet module install puppet-augeasproviders_sysctl --version 3.2.0

puppet module install puppet-postfix  --ignore-dependencies

puppet module install puppetlabs-mailalias_core --version 1.2.0

puppet module install 'puppetlabs-firewall' --ignore-dependencies

实验步骤

前置条件

Service Principal

服务主体必须对该订阅具有完全访问权限,除非指定了build_resource_group_name选项,在这种情况下,它需要对build_resource_group_name参数中指定的现有资源组具有所有者权限

流程说明

1&2、Packer从SIG获取源镜像,并通过SP服务账号创建VM

3、执行Shell脚本,初始化系统配置

4、Builders将生成的Golden Image回传至SIG

步骤一、安装Packer

packer可以安装在任何环境,本次基于Linux服务器

yum install -y yum-utils

yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

yum -y install packer

#注意:这里有个坑,系统默认有个packer命令,AUR中的包打包器是Arch的包管理工具的旧名称,而不是HashiCorp packer

#所以默认的packer命令已经被占用了,可以使用绝对路径或者重命名再使用:

[root@localhost ~]# whereis packer

packer: /usr/bin/packer /usr/sbin/packer

#这里我们使用/usr/bin/packer

步骤二、配置Packer流水线

在当前目录,配置如下文件

azure.pkr.hcl:主配置文件,定义执行的流水线步骤

values.auto.pkrvars.hcl:变量赋值配置(赋值内容就不展示了,大家按照对应字段填写自己的项目信息)

variables.pkr.hcl:变量定义配置

实验中的原始镜像是我配置在shared_image_gallery中的,生成的镜像也会放到这里

azure.pkr.hcl

 packer {

  required_plugins {

    azure = {

      version = "=2.0.1"

      source  = "github.com/hashicorp/azure"

    }

  }

}

source "azure-arm" "linux" {

  client_id       = var.client_id

  client_secret   = var.client_secret

  subscription_id = var.subscription_id

  tenant_id       = var.tenant_id

  cloud_environment_name = var.cloud_environment_name

  shared_image_gallery {

    subscription   = var.sig_src_subscription

    resource_group = var.sig_src_resource_group

    gallery_name   = var.sig_src_gallery_name

    image_name     = var.sig_src_image_name

    image_version  = var.sig_src_image_version

  }

  build_resource_group_name   = var.packer_build_resource_group_name

  os_type                     = var.packer_os_type

  vm_size                     = var.packer_vm_size

  os_disk_size_gb             = var.packer_os_disk_size_gb

  virtual_network_name        = var.packer_virtual_network_name

  virtual_network_subnet_name = var.packer_virtual_network_subnet_name

  virtual_network_resource_group_name = var.packer_virtual_network_resource_group_name

  ssh_password = var.packer_ssh_password

  ssh_username = var.packer_ssh_username

  shared_image_gallery_destination {

    subscription         = var.sig_dst_subscription

    resource_group       = var.sig_dst_gallery_resource_group

    gallery_name         = var.sig_dst_gallery_name

    image_name           = var.sig_dst_image_name

    image_version        = var.sig_dst_image_version

    replication_regions  = var.sig_dst_replication_regions

    storage_account_type = var.sig_dst_storage_account_type

  }

}

build {

  sources = [

    "source.azure-arm.-linux"

  ]

  provisioner "shell" {

    execute_command = "echo packer"

    ]

  }

}

步骤三、运行Packer流水线

/usr/bin/packer init .

步骤四、Packer最终效果

会在Azure生成最终镜像,我们可以基于该镜像创建新的VM

后续任何更新,都可以通过调整packer流水线来完成镜像版本的迭代,十分高效和便利

附言

packer生成的镜像也可以和TF/Pulumi集成,相关参考代码如下

provider "azurerm" {

  features = {}

}

  

data "azurerm_shared_image_gallery_image" "example" {

  name                = "your-image-name"

  resource_group_name = "your-resource-group"

  gallery_name        = "your-gallery-name"

}

  

resource "azurerm_virtual_machine" "example" {

  name                  = "example-vm"

  resource_group_name   = "your-resource-group"

  location              = "your-location"

  size                  = "Standard_DS2_v2"

  admin_username        = "your-username"

  admin_password        = "your-password"

  network_interface_ids = [azurerm_network_interface.example.id]

  

  storage_image_reference {

    publisher = data.azurerm_shared_image_gallery_image.example.publisher

    offer     = data.azurerm_shared_image_gallery_image.example.offer

    sku       = data.azurerm_shared_image_gallery_image.example.sku

    version   = data.azurerm_shared_image_gallery_image.example.version

  }

  

  os_profile {

    computer_name  = "example-vm"

    admin_username = "your-username"

    admin_password = "your-password"

  }

  

  os_profile_linux_config {

    disable_password_authentication = false

  }

}

  

resource "azurerm_network_interface" "example" {

  name                = "example-nic"

  resource_group_name = "your-resource-group"

  location            = "your-location"

  

  ip_configuration {

    name                          = "internal"

    subnet_id                     = "your-subnet-id"

    private_ip_address_allocation = "Dynamic"

  }

}

import * as pulumi from "@pulumi/pulumi";

import * as azure from "@pulumi/azure";

  

const config = new pulumi.Config();

  

const resourceGroup = new azure.core.ResourceGroup("myResourceGroup");

  

const sharedImageGallery = new azure.compute.SharedImageGallery("mySIG", {

    resourceGroupName: resourceGroup.name,

    galleryName: "myGallery",

    location: resourceGroup.location,

});

  

const imageDefinition = new azure.compute.ImageDefinition("myImageDefinition", {

    resourceGroupName: resourceGroup.name,

    galleryName: sharedImageGallery.name,

    location: resourceGroup.location,

    osType: "Linux"// or "Windows"

});

  

const imageVersion = new azure.compute.ImageVersion("myImageVersion", {

    resourceGroupName: resourceGroup.name,

    galleryName: sharedImageGallery.name,

    imageDefinitionName: imageDefinition.name,

    location: resourceGroup.location,

    publishingProfile: {

        endOfLifeDate: "2023-01-01T00:00:00Z",

    },

});

  

const vm = new azure.compute.VirtualMachine("myVM", {

    resourceGroupName: resourceGroup.name,

    location: resourceGroup.location,

    vmSize: "Standard_D2s_v3",

    osProfile: {

        computerName: "myVM",

        adminUsername: "adminuser",

        adminPassword: "xxxxxx",

    },

    storageImageReference: {

        id: imageVersion.id,

    },

    storageOsDisk: {

        name: "myOsDisk",

        createOption: "FromImage",

        caching: "ReadWrite",

    },

    networkProfile: {

        networkInterfaces: [{

            id: "/subscriptions/your-subscription-id/resourceGroups/your-network-rg/providers/Microsoft.Network/networkInterfaces/your-nic-name",

        }],

    },

});

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值