一文详解基于Kubescape进行Kubernetes安全加固

目录
  • 正文
  • Kubernetes 加固概述
    • 通用性的安全建议
  • Kubescape 概述
  • Kubescape 基本原理
  • Kubescape 安装部署
    • Linux 安装 Kubescape
    • macOS 安装 Kubescape
  • Kubescape 实践
    • 扫描结果分析
  • 常用扫描技巧

正文

Hello folks! 今天我们介绍一款开源容器平台安全扫描工具 - Kubescape。作为第一个用于测试 Kubernetes 集群是否遵循 NSA-CISA 和 MITREATT&CK 等多个框架安全部署规范的开源工具,Kubescape 在整容器编排生态中具有举足轻重的意义。在这篇文章中,我们将解析什么是 Kubernetes 加固以及如何基于 Kubescape 工具进行 Kubernetes 生态体系加固。

Kubernetes 加固概述

随着云原生理念的不断普及、生态体系的不断完善,越来越多的企业开始迈入云化之路,无论是基于何种缘由。然而,在实施过程中,我们中的大多数人只考虑到如何将现有的业务系统平滑迁移至 Kubernetes 平台,其中有多少人考虑过 Kubernetes 集群的安全性?

根据 RedHat 报道,“人为错误” 是 Kubernetes 安全事故的主要原因。事实上,94% 的受访者承认他们在过去一年中经历过 Kubernetes 和容器环境安全事件。更糟糕的是,超过一半(55%)的受访者在过去一年中由于安全问题最终推迟了 Kubernetes  应用程序生产开发。因此,如果我们尽可能想建设一个最好的系统,至少在人为错误层面要有所改变。

同样,针对基础设施安全,我们可能会在托管环境中实施很多限制,但这还还远远不够,因为如果存在任何人为错误或任何恶意软件/软件包或我们跳过的其他可能原因,大多数这些可能会受到损害初始设置时间。因为,就像我们正在迁移到 Kubernetes 一样,黑客也可以开始针对 Kubernetes 环境进行数据窃取、拒绝服务或加密货币挖掘等。

因此,如果我们计划将 Kubernetes 作为我们将来的业务支撑平台的未来,那么我们有责任保护 Kubernetes 集群,为此我们应该实施加强 Kubernetes 安全性的技术。

那么,什么是 Kubernetes 加固呢?通常我们可以这样理解:Kubernetes 加固主要为保护 Kubernetes 系统而采取的一系列安全执行措施,从而不被外界影响。

通用性的安全建议

1、尽可能扫描 Container 和 Pod 以查找漏洞或配置错误

2、以尽可能少的权限运行 Container 和 Pod

3、使用网络分离来控制危害可能造成的损害程度

4、使用防火墙技术来限制不必要的网络连接,并采用加密机制

5、使用强身份验证和授权来限制用户和管理员访问以及限制攻击面

6、捕获和监控审计日志,以便管理员可以收到潜在恶意活动的警报

7、定期审查所有 Kubernetes 设置并基于漏洞扫描来确保平台处于安全状态以及进行必要的安全补丁措施。

基于如上所述的通用性建议在某些场景中可能对我们的业务运行有所帮助。例如,我们都知道我们不应该以 root 用户身份运行应用程序,但我们可以看到,许多 Kubernetes 容器服务仍以 root 用户身份运行,并且应用程序亦是如此,即便它们不需要特权执行。即使有警告,开发人员也会构建以 root 身份执行的容器应用程序。为什么?因为这很容易。同时它也很危险。

当然,即使是 Kubernetes 也有其自身的安全问题。因此,我们所能做的便是基于当前的业务现状,遵守网络安全技术报告中的建议,以确保应用程序的安全,并通过补丁、升级和更新等相关措施使得系统保持最新状态,以降低风险。

Kubescape 概述

作为一个 K8s 开源工具,Kubescape 能够提供 Kubernetes 单一管理平台,包括风险分析、安全合规、RBAC 可视化工具和图像漏洞扫描。Kubescape 工具能够扫描 K8s 集群、YAML 文件和 HELM 图表,根据多个框架(如 NSA-CISA、MITRE ATT & CK®)检测错误配置、软件漏洞和早期 RBAC(基于角色的访问控制)违规 CI/CD 管道,即时计算风险评分并显示随时间变化的风险趋势。

基于其易用的 CLI 界面、灵活的输出格式和自动扫描功能,Kubescape 已成为开发人员中增长最快的 Kubernetes 工具之一,为 Kubernetes 用户和管理员节省了宝贵的时间、精力和资源。Kubescape 与其他 DevOps 工具本地集成,包括 Jenkins、CircleCI、Github 工作流、Prometheus 和 Slack,并支持多云 K8s 部署,如 EKS、GKE 和 AKS。

总而言之,Kubescape 能够基于非根容器、特权容器、主机网络访问、匿名请求等多方面属性进 Kubernetes 集群环境的健康扫描,检测错误配置和软件漏洞,即时计算风险评分并显示风险随时间变化的趋势。扫描结果以命令行表格或 JSON 格式显示,显示可能被利用的不同错误配置区域,从而帮助工程师评估 Kubernetes 环境的安全状况。

基于上述所述,Kubescape 功能特性主要体现在 4 个层面:Kubernetes 配置扫描、Kubernetes 容器漏洞扫描、Kubernetes RBAC 简化以及在 CI/CD 工作流中运行等。具体内容可参考如下思维导图:

Kubescape 基本原理

Kubescape 基于 OPA 引擎 和 ARMO 的框架机制。它从 API Server 检索 Kubernetes 对象,并通过运行一组由 ARMO 开发的 Rego Snippets 片段规则来对所流经的对象信息进行扫描。默认情况下,扫描输出结果以“控制台模型”的方式进行打印展示,但也可以以 JSON 或 Junit 格式检索它们以进行进一步处理。

Kubescape 工作原理如下所示:

基于上述架构图所述,OPA 作为一个通用策略引擎,可在我们所构建的 Kubernetes 集群中实施策略编排。基于 OPA ,我们可以计算出: 用户 X 是否能够可以对资源 Z 做 Y 操作? 应该允许查看哪些记录?等。

而作为一种规则,Rego 是 OPA 开发的一种声明性策略语言。基于此,Kubescape 从 API Server 中检索有关 K8s 对象的信息,然后使用 OPA 对其进行扫描。

Kubescape 基于控件模型,在生态系统中,NSA/MITRE/ArmoBest/DevOpsBest指南被分解成小的策略集(可称之为控制)。每个控件都有自己的一组规则,用于扫描集群或管道。

关于 ARMO 的 ArmoBest 框架,当发现最新漏洞时,ARMO 会不断升级此框架。每当行业中发生任何最新的安全漏洞,Armo 都会尝试尽快对其库进行更新。

Kubescape 安装部署

关于 Kubescape 工具的安装较为简单,Kubescape 支持在 Windows、macOS 以及 Linux 等平台上部署使用。

在部署 Kubescape 工具之前,我们需要部署一个 Kubernetes Cluster 并使其处于运行状态。如下所示:

[leonli@Leon kubescape ] % kubectl get po -A -o wideNAMESPACE              NAME                                        READY   STATUS    RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATESkube-system            coredns-64897985d-v9jcf                     1/1     Running   0          2d17h   172.17.0.2     k8s-cluster   <none>           <none>……kubernetes-dashboard   dashboard-metrics-scraper-58549894f-ns2ld   1/1     Running   0          2d17h   172.17.0.11    k8s-cluster   <none>           <none>……monitoring             prometheus-k8s-0                            2/2     Running   0          2d17h   172.17.0.9     k8s-cluster   <none>           <none>monitoring             prometheus-operator-6dc9f66cb7-h7mrp        2/2     Running   0          2d17h   172.17.0.7     k8s-cluster   <none>           <none>traefik-v2             traefik-767667c75c-kwjn4                    1/1     Running   0          2d13h   172.17.0.12    k8s-cluster   <none>           <none>

我这里以 Linux、macOS 操作系统为例,简要介绍一下 Kubescape 安装部署过程,具体如下。

Linux 安装 Kubescape

这里主要基于 GitHub 下载的 Kubescape CLI 二进制文件进行安装,部署,当然,也可通过命令行一次性安装,具体操作如下:

[leonli@Leon kubescape ] % wget https://github.com/kubescape/kubescape/releases/download/v2.0.176/kubescape-macos-latest

拉取到本地后,然后进行执行即可,具体暂不在本文中赘述。

macOS 安装 Kubescape

基于 macOS 安装 Kubescape 也有多种不同的方式,其简要的安装步骤主要分为如下 2 步:

1、添加 Kubescape GitHub 存储库:

[leonli@Leon kubescape ] % brew tap kubescape/tap

2、执行 Kubescape 安装

[leonli@Leon kubescape ] % brew install kubescape-cli[leonli@Leon kubescape ] % kubescape versionYour current version is: v2.0.176

此时,可借助 -h 命令标志来获取有关某个命令的额外信息,如下所示:

[leonli@Leon kubescape ] % kubescape -h     Kubescape is a tool for testing Kubernetes security posture. Docs: https://hub.armosec.io/docs
Usage:  kubescape [command]
Examples:
  # Scan command  kubescape scan --submit
  # List supported frameworks  kubescape list frameworks
  # Download artifacts (air-gapped environment support)  kubescape download artifacts
  # View cached configurations  kubescape config view
Available Commands:  completion  Generate autocompletion script  config      Handle cached configurations  delete      Delete configurations in Kubescape SaaS version  download    Download control,framework,artifacts,controls-inputs,exceptions  help        Help about any command  list        List frameworks/controls will list the supported frameworks and controls  scan        Scan the current running cluster or yaml files  submit      Submit an object to the Kubescape SaaS version  update      Update your version  version     Get current version
Flags:      --cache-dir string   Cache directory [$KS_CACHE_DIR] (default "/Users/leonli/.kubescape")      --disable-color      Disable Color output for logging      --enable-color       Force enable Color output for logging  -h, --help               help for kubescape  -l, --logger string      Logger level. Supported: debug/info/success/warning/error/fatal [$KS_LOGGER] (default "info")
Use "kubescape [command] --help" for more information about a command.

Kubescape 实践

Kubescape scan 命令扫描集群中可用每个 Kubernetes 对象和集群上安装的 Helm Charts。它具有以下标志:

1、--submit:此标志将扫描结果发送到 Armo 管理门户

2、--enable-host-scan:此标志部署了ARMOK K8s 主机传感器 DaemonSet,该DaemonSet 从主机收集有关集群的有价值且无限的信息

3、--verbose:此标志显示扫描的所有资源

例如,现在我们扫描下所部署的 K8s Cluster,操作命令如下所示:

[leonli@Leon kubescape ] % kubescape scan --submit --enable-host-scan --format-version v2 --verbose[info] Kubescape scanner starting[info] Installing host scanner……[success] Done scanning. Cluster: k8s-cluster^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^################################################################################ApiVersion: Kind: ServiceAccountName: prometheus-k8sNamespace: monitoring
Controls: 14 (Failed: 1, Excluded: 0)
+----------+--------------------------------+------------------------------------+-----------------------+| SEVERITY |          CONTROL NAME          |                DOCS                | ASSISTANT REMEDIATION |+----------+--------------------------------+------------------------------------+-----------------------+| Medium   | Access container service       | https://hub.armosec.io/docs/c-0053 |                       ||          | account                        |                                    |                       |+----------+--------------------------------+------------------------------------+-----------------------+……ApiVersion: v1Kind: ServiceAccountName: defaultNamespace: traefik-v2
Controls: 4 (Failed: 3, Excluded: 0)
+----------+--------------------------------+---------------------------------------+------------------------------------+| SEVERITY |          CONTROL NAME          |                 DOCS                  |       ASSISTANT REMEDIATION        |+----------+--------------------------------+---------------------------------------+------------------------------------+| Medium   | Automatic mapping of service   | https://hub.armosec.io/docs/c-0034    | automountServiceAccountToken=false ||          | account                        |                                       |                                    |+          +--------------------------------+---------------------------------------+                                    +|          | Ensure that Service Account    | https://hub.armosec.io/docs/cis-5-1-6 |                                    ||          | Tokens are only mounted where  |                                       |                                    ||          | necessary                      |                                       |                                    |+          +--------------------------------+---------------------------------------+                                    +|          | Ensure that default service    | https://hub.armosec.io/docs/cis-5-1-5 |                                    ||          | accounts are not actively used |                                       |                                    |+----------+--------------------------------+---------------------------------------+------------------------------------+

如上扫描命令将输出集群中每个对象的所有安全分析。由于提供了 “--submit” 提交参数选项,结果将会推送到 Armosec 门户。因此,可以通过登录 Dashboard 查看详细信息,如下所示:

基于上述所展示,在 Dashboard 页面,我们可以看到当前 Kubernetes 集群所承载的所有资源的健康状态。除此之外,我们还可以基于 RBAC 可视化检查谁有权访问哪些资源以及做了什么操作等。例如,如果我们想检查谁可以执行到一个 Pod 中,那么我们可以基于它运行一个查询,Kubescape 会以一种很好的可视化方式向显示结果。我们还可以观测哪些用户可以访问 Kubernetes 仪表板等。

扫描结果分析

我们以 Namespace: monitoring 的 prometheus-adapter 为例,针对其对象的风险分析,具体如下所示:

################################################################################ApiVersion: apps/v1Kind: DeploymentName: prometheus-adapterNamespace: monitoring
Controls: 35 (Failed: 12, Excluded: 0)
+----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+| SEVERITY |              CONTROL NAME              |                 DOCS                  |                                ASSISTANT REMEDIATION                                |+----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+| High     | Apply Security Context to Your         | https://hub.armosec.io/docs/cis-5-7-3 | spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem=true        ||          | Pods and Containers                    |                                       | spec.template.spec.containers[0].securityContext.runAsNonRoot=true                  ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false     ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.capabilities.drop=NET_RAW          ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.seLinuxOptions=YOUR_VALUE          ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.seccompProfile=YOUR_VALUE          |+----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+| Medium   | Allow privilege escalation             | https://hub.armosec.io/docs/c-0016    | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false     |+          +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+|          | ……                                     |                                       | spec.template.spec.containers[0].securityContext.seLinuxOptions=YOUR_VALUE          ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.capabilities.drop[0]=YOUR_VALUE    |+          +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+|          | Non-root containers                    | https://hub.armosec.io/docs/c-0013    | spec.template.spec.containers[0].securityContext.runAsNonRoot=true                  ||          |                                        |                                       | spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation=false     |+----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+| Low      | Immutable container filesystem         | https://hub.armosec.io/docs/c-0017    | spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem=true        |+          +----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+|          | Label usage for resources              | https://hub.armosec.io/docs/c-0076    | metadata.labels=YOUR_VALUE                                                          ||          |                                        |                                       | spec.template.metadata.labels=YOUR_VALUE                                            |+----------+----------------------------------------+---------------------------------------+-------------------------------------------------------------------------------------+

我们可以看到,prometheus-adapter 扫描共涉及 35 个控件,其结果威胁高、中及低都有涉及,依据 Kubescape 给出的建议进行优先级修复。

基于 Kubescape 风险分析具有以下字段:

# 威胁严重性:该字段衡量威胁的严重程度。威胁分为三个级别,即:高、中和低。

# 控件名称:此字段说明正在分析的组件或方面的名称。

# 文档:此字段包含将您重定向到包含有关扫描期间检测到的风险和威胁信息的页面的链接。

# Assistant remediation:此字段包含可以对 YAML 文件或集群进行的更改以消除威胁。

被标记为“严重”/“高”的漏洞,通常基于实际的业务场景建议需要立即修复。在修复过程中可参考文档和协助修复列中的信息来帮助我们修复检测到的漏洞。

常用扫描技巧

1、指定 Yaml 文件扫描

基于不同的场景需求,面对较多的文件时,我们可能需要会针对性的进行文件扫描,从而减少不必要的数据输出。使用 Kubescape 不仅仅针对容器集群的全局性扫描,而且也可以扫描单个文件,具体命令如下所示:

[leonli@Leon kubescape ] % kubescape scan prometheusAdapter-deployment.yaml 

2、文件导出

通常,如果使用 “--verbose” 参数标志,它可能会显示更多的行,终端可能会清除最上面的行,或者 CI 构建日志可能看起来很难全部阅读。为了排序,我们可以将结果输出为 PDF 格式,这样你就可以清楚地阅读它或 CI/CD 过程的一部分,你可以存储在一些公共区域,如 Artifactory Repo 以供安全审查。

可以通过添加 ”--format pdf--output filename.pdf“ 扫描命令来实现扫描结果存档于 PDF 格式 文件中,如下所示,它支持所有扫描命令。

[leonli@Leon kubescape ] % kubescape scan --format pdf --output kubescape_results.pdf

基于上述命令行操作,扫描结果以 .pdf 格式文件将保存在当前集群目录或扫描集群时当前使用的目录中。

3、Git repository 扫描

除上述所述之外,Kubescape 甚至支持从 Git 存储库扫描清单,可以使用以下命令扫描存储库,这将克隆存储库并扫描清单并提交结果。

[leonli@Leon kubescape ] % kubescape scan https://github.com/foxutech/kubernetes

针对“威胁”的可观测性是安全分析中的一个关键组成部分,因为它会让我们时刻保持警惕并告知 Kubernetes 集群中可能被黑客利用的所有风险资源。因此,进行实时的容器集群和 YAML 文件扫描是启动安全审计会话的最佳方式。

因此处内容涉及面较广,由于时间关系,本文解析到此为止,希望对大家有用。关于 Kubescape 更多需要了解的信息,欢迎大家关注我们其它相关文章!

(0)

相关推荐

  • Kubernetes controller manager运行机制源码解析

    目录 Run StartControllers ReplicaSet ReplicaSetController syncReplicaSet Summary Run 确立目标 理解 kube-controller-manager 的运行机制 从主函数找到run函数,代码较长,这里精简了一下 func Run(c *config.CompletedConfig, stopCh <-chan struct{}) error { // configz 模块,在kube-scheduler分析中已经了解

  • IoT 边缘集群Kubernetes Events告警通知进一步配置详解

    目录 目标 配置 告警内容显示资源名称 屏蔽特定的节点和工作负载 最终效果 目标 上一篇文章 IoT 边缘集群基于 Kubernetes Events 的告警通知实现 告警恢复通知 - 经过评估无法实现 原因: 告警和恢复是单独完全不相关的事件, 告警是 Warning 级别, 恢复是 Normal 级别, 要开启恢复, 就会导致所有 Normal Events 都会被发送, 这个数量是很恐怖的; 而且, 除非特别有经验和耐心, 否则无法看出哪条 Normal 对应的是 告警的恢复. 未恢复进行

  • kubernetes数据持久化PV PVC深入分析详解

    目录 1. 什么是PV,PVC? 1.1 什么是PV 1.2 什么是PVC? 2. PV资源实践 2.1 PV配置字段详解 2.2 HostPath PV示例 2.3 NFS PV示例 3. PVC资源实践 3.1 PVC配置清单详解 3.2 hostPath-PVC示例 3.3 NFS-PV-PVC实践之准备NFS共享存储 3.4 准备NFS-PVC 3.4.1准备Pod并使用PVC 3.4.2 测试数据持久性 1. 什么是PV,PVC? 1.1 什么是PV 官方文档地址: https://k

  • kubernetes数据持久化StorageClass动态供给实现详解

    目录 正文 基于NFS实现动态供应 准备NFS服务端的共享目录 安装NFS-Server驱动. 部署NFS-Provisioner 创建StorageClass 创建PVC,自动关联PV 创建Pod,测试数据是否持久. 正文 存储类的好处之一便是支持PV的动态供给,它甚至可以直接被视作为PV的创建模版,用户用到持久性存储时,需要通过创建PVC来绑定匹配的PV,此类操作需求较大,或者当管理员手动创建的PV无法满足PVC的所有需求时,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活

  • Kubernetes上使用Jaeger分布式追踪基础设施详解

    目录 正文 微服务架构中的可观察性 分布式追踪 Jaeger组件 架构图 Jaeger客户端 Jaeger代理 Jaeger SideCar 代理 Jaeger Daemonset 代理 Jaeger Collector 服务 Jaeger Query 查询服务 Storage Configuration 存储配置 监控 正文 作为分布式系统(或任何系统)的一个组成部分,监测基础设施的重要性怎么强调都不过分.监控不仅要跟踪二进制的 "上升 "和 "下降 "模式,还要

  • 一文详解基于Kubescape进行Kubernetes安全加固

    目录 正文 Kubernetes 加固概述 通用性的安全建议 Kubescape 概述 Kubescape 基本原理 Kubescape 安装部署 Linux 安装 Kubescape macOS 安装 Kubescape Kubescape 实践 扫描结果分析 常用扫描技巧 正文 Hello folks! 今天我们介绍一款开源容器平台安全扫描工具 - Kubescape.作为第一个用于测试 Kubernetes 集群是否遵循 NSA-CISA 和 MITREATT&CK 等多个框架安全部署规范

  • zabbix 4.04 安装文档教程详解(基于CentOS 7.6)

    1    安装前准备: 1.1   安装JDK 卸载openjdk # rpm -qa | grep java # yum remove java-1.8.0-openjdk # yum remove java-1.8.0-openjdk-headless 安装JDK包 # rpm -ivh jdk-8u191-linux-x64.rpm 1.2   安装依赖包 # yum install -y net-snmp net-snmp-devel OpenIPMI-devel libssh2-dev

  • 一文详解kubernetes 中资源分配的那些事

    目录 概要 一个nginx的配置 我们进入nginx容器所在目录看下 cpu.shares cpu.cpu.cfs_period_us.cpu.cfs_quota_us 资源使用率数据来源 下kubelet相关配置:** 概要 在k8s中,kube-scheduler是Kubernetes中的调度器,用于将Pod调度到可用的节点上.在调度过程中,kube-scheduler需要了解节点和Pod的资源需求和可用性情况,其中CPU和内存是最常见的资源需求.那么这些资源的使用率是怎么来的呢?当Pod调

  • 一文详解Java etcd的应用场景及编码实战

    目录 一.白话etcd与zookeeper 二.etcd的4个核心机制 三.Leader选举与客户端交互 四.etcd的应用场景 4.1. kubernetes大脑 4.2. 服务注册与发现 4.3. 健康检查与状态变更通知 4.4.分布式锁 4.5.实现消息队列(纯扯淡) 五.etcd安装 六.jetcd的编码实现配置管理 本文首先用大白话给大家介绍一下etcd是什么?这部分内容网上已经有很多了. etcd有哪些应用场景?这些应用场景的核心原理是什么? 最后不能光动嘴不动手.先搭建一个etcd

  • 详解基于IDEA2020.1的JAVA代码提示插件开发例子

    之前因为项目组有自己的代码规范,为了约束平时的开发规范,于是基于2019.1.3版本开发了一个代码提示的插件.但是在把IDEA切换到2020.1版本的时候,却发现疯狂报错,但是网上关于IDEA插件开发的相关文章还是不够多,只能自己解决.于是根据官方的SDK文档,使用Gradle重新构建了一下项目,把代码拉了过来.下文会根据2020.1版本简单开发一个代码异常的提示插件,把容易踩坑的地方提示一下. 1.首先先根据IDEA插件开发官方文档,用Gradle新建一个project 选中file -> n

  • Java 添加、删除、格式化Word中的图片步骤详解( 基于Spire.Cloud.SDK for Java )

    本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片.具体可通过addImage()方法添加图片.deleteImage()方法删除图片.updateImageFormat()格式化Word中的图片以及getImageFormat()获取Word中的图片格式等.操作方法和代码示例可参考下文中的步骤. 步骤1:导入jar文件 创建Maven项目程序,通过maven仓库下载导入.以IDEA为例,新建Maven项目,在pom.xml文件中配置m

  • 详解基于Vue cli开发修改外部组件Vant默认样式

    前言 在引入外部组件的时候,想要修改默认样式,可以通过class修改,但一般会有权重不够等各种原因,官网其实列出了一套主题定制的方案,通过覆盖配置文件来修改样式,官网地址:主题定制 提示:以下是本篇文章正文内容,下面案例可供参考 一.Less 因为Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,可以通过替换样式变量即可定制你自己需要的主题. 给你的项目配置less: npm install less --save-dev npm install less-loader --s

  • 一文详解JS私有属性的6种实现方式

    目录 _prop Proxy Symbol WeakMap #prop ts private 总结 class 是创建对象的模版,由一系列属性和方法构成,用于表示对同一概念的数据和操作. 有的属性和方法是对外的,但也有的是只想内部用的,也就是私有的,那怎么实现私有属性和方法呢? 不知道大家会怎么实现,我梳理了下,我大概用过 6 种方式,我们分别来看一下: _prop 区分私有和公有最简单的方式就是加个下划线 _,从命名上来区分. 比如: class Dong { constructor() {

  • 一文详解Java中的类加载机制

    目录 一.前言 二.类加载的时机 2.1 类加载过程 2.2 什么时候类初始化 2.3 被动引用不会初始化 三.类加载的过程 3.1 加载 3.2 验证 3.3 准备 3.4 解析 3.5 初始化 四.父类和子类初始化过程中的执行顺序 五.类加载器 5.1 类与类加载器 5.2 双亲委派模型 5.3 破坏双亲委派模型 六.Java模块化系统 一.前言 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程

  • 一文详解Java线程中的安全策略

    目录 一.不可变对象 二.线程封闭 三.线程不安全类与写法 四.线程安全-同步容器 1. ArrayList -> Vector, Stack 2. HashMap -> HashTable(Key, Value都不能为null) 3. Collections.synchronizedXXX(List.Set.Map) 五.线程安全-并发容器J.U.C 1. ArrayList -> CopyOnWriteArrayList 2.HashSet.TreeSet -> CopyOnW

随机推荐