MinIO 简介
MinIO 是天然的云原生存储,可以作为轻量级容器运行,由相关编排服务(如 Kubernetes )管理。
整个服务器是一个不到100MB的静态二进制文件,并且在使用CPU和内存资源方面即使在高负载场景也非常高效,因此可以在共享硬件上共同托管大量租户。
MinIO 可以在任何地方和任何云设施上运行,但大多数情况下是在带有本地硬盘( JBOD/JBOF )的商用服务器上运行。
集群中的所有服务器在功能上是相等的(完全对称的体系结构),即无中心节点,所有节点均衡数据,没有node节点或元数据服务器。
MinIO 将数据和元数据作为对象一起写入,从而消除了对元数据数据库的需求。此外, MinIO 将所有功能(擦除码、位校验、加密)作为内联的、严格一致的操作来执行,从而实现 MinIO 高效的弹性。
每个 MinIO 集群是分布式 MinIO 服务器的集合,每个节点有一个进程。
MinIO 作为单个进程运行在用户空间中,并使用轻量级的协同例程实现高并发性。
硬盘驱动器被分组为擦除集,并且使用确定性散列算法将对象放置在这些集上。
MinIO 是为大规模、多数据中心云存储服务而设计的。
每个租户运行自己的 MinIO 集群,与其他租户完全隔离,从而能够保护它们免受升级、更新和安全事件的干扰。
每个租户通过跨地理区域联合集群来独立扩展。
MinIO 特性
MinIO 支持多种特性,主要有:
- Replication
- Encryption
- object Immutability
- Identity + Access Mgt
- Information Lifecycle
- Key Management Server
- S3 Compatibility
- Firewall
- Cache
Replication
在生产环境中,对象存储的主动复制是在重要场景中的重要任务, MinIO 是目前唯一提供该功能的产品。
MinIO 支持同步和近同步复制,具体取决于架构的选择以及数据的变化率,在这些场景中,复制必须尽可能接近严格一致(受限于到带宽因素和变化率)。
MinIO 的数据复制方案创建了双活存储系统,主要用于:
- 加密或未加密的对象及其关联的元数据(自动写入 object )
- object 版本
- 对象标记
- S3对象锁保留信息
由此可见, MinIO 的数据复制是为大规模恢复而设计的,主要特点包括:
- 源 bucket 和目标 bucket 具有相同名称的能力,这是应用程序必须在不中断的情况下透明地转移到远程站点的需求。
- 本机支持跨源和目标的自动对象锁定/保留复制。
- 近同步复制,以便在 bucket 上发生任何变化后立即更新对象。 MinIO 严格遵循数据中心内部的一致性和数据中心之间的最终一致性来保护数据。
- 推送复制失败事件的通知功能,应用程序可以订阅这些事件并向操作团队发出警报。
Encryption
MinIO 通过最高级别的加密和广泛的优化提供了更多的功能特性,通常这些优化又消除了与存储加密操作所带来的开销。
MinIO 对存储在磁盘上和通过网络传输的数据进行加密。
MinIO 最先进的加密方案支持使用现代行业标准加密算法(如 AES-256-GCM, ChaCha20-Poly1305, 和 AES-CBC )的粒度对象级加密。
MinIO 与 S3 加密协议完全兼容,并通过包括对非AWS密钥管理服务(如 Hashicorp Vault、Gemalto KeySecure和Google Secrets Manager )的支持来扩展S3。
-
网络传输加密
当数据在对象存储和应用程序之间传输时,它可能在多个不守信的网络之间传递。
在数据通过网络传输时进行加密,可以成功地减轻中间人攻击,并确保数据无论采用哪种路由都保持安全。MinIO 支持集群中所有组件之间的 TLS ( Transport Layer Security )v1.2+,这种方法确保在集群间或集群内加密通信中没有弱链路。
TLS 是一种全链路的加密框架,通常用于https中,也是银行、网站和其他依赖数据存储加密的企业级系统使用的加密协议。MinIO 的 TLS 实现在 CPU 指令级别进行了优化,极大的降低了性能开销。
它只需要为集群中的每个 MinIO 服务器指定 TLS 私钥和公共证书。
对于 Kubernetes 环境, MinIO Kubernetes Operator 集成(自动)在租户部署过程中生产和分配 TLS 证书。
MinIO 也支持多个 TLS 证书,每个证书对应一个特定/独立的域名, MinIO 使用服务器名称指示(SNI)来确定为任何给定请求提供哪个证书。 -
object 加密
存储在磁盘上的数据完全依赖于磁盘的安全性,进而依赖于主机系统来保证数据的安全。
MinIO 服务器端 object 加密在数据存储到磁盘之前自动加密(静态加密),这种方法保证没有数据未加密就写入了磁盘,这一安全基线确保静态数据的机密性、完整性和真实性。
MinIO 支持客户端驱动和 object 默认自动加密的两种方式,以实现数据加密的最大灵活性。MinIO 服务器端加密兼容Amazon AWS-S3语义(SSE-S3),同时 MinIO 也扩展了对AWS KMS的基线支持,包括 Hashicorp Vault 和 Thales Ciphertrust 等常见企业 KMS 系统。
MinIO 还支持客户端驱动的加密( SSE-C ),其中应用程序可以指定用于加密对象的数据密钥。
对于 SSE-S3 和 SSE-C , MinIO 服务器执行所有加密操作,包括密钥轮换和对象的重新加密。通过自动服务器端加密, MinIO 使用唯一的密钥对每个 object 进行加密,并使用动态加密密钥和从外部KMS或客户端提供的密钥派生的密钥应用多层附加加密。
这种安全而复杂的方法在 MinIO 中实现,而不需要同时使用多个独立的内核和用户空间加密实用程序。MinIO 使用身份验证加密方案( AEAD )在 object 被写入或从 object 存储中读取时对 object 进行加密/解密。
MinIO AEAD 加密支持 AES-256-GCM 和 ChaCha20-Poly1305 等行业标准加密协议,以保护对象数据。MinIO 的 cpu 级优化(如 SIMD 加速)确保了加密/解密操作的性能开销极大降低,同时可以随时运行自动的 bucket 加密,而不是被迫采用次优的安全选择。
-
MinIO 密钥加密服务
MinIO 提供了一个内置的密钥加密选项。
MinIO 的密钥加密服务( )是一个用于高性能应用程序的无状态分布式密钥管理系统。
通常结合 Kubernetes 进行部署和运行,并向应用程序分发加密密钥。KES是 MinIO 服务器端对象加密( SSE-S3 )所需的组件,KES 支持 MinIO 集群上的加密操作,是确保可扩展和高性能加密操作的关键机制。
KES作为 MinIO 集群和外部 KMS 之间的中介,根据需要生成加密密钥并执行加密操作,并且不受KMS限制的约束。
因此,存在一个中央KMS保护主密钥,并充当基础设施中的信任源,KES 简化了部署和管理。
object Immutability
对于存储而言保护数据免受删除(意外或刻意)非常重要。
MinIO 支持一系列完整的功能,包括 object lock 、 object retention 、 legal holds 、 governance ,和 compliance 。
-
object lock
可以与 MinIO 版本控制一起使用来确保数据不变性,消除数据篡改或破坏的风险。 -
object retention
object 保留规则确保对象在一段时间内受到 WORM 保护。
object 保留策略指定在对象版本上显式设置或通过 bucket 默认设置的保留周期,在 bucket 级别设置的默认所配置适用于随后创建的所有对象,而不会追溯应用于先前创建的对象的版本。当使用 bucket 默认设置时,以天或年为单位设置持续时间,以定义存储在 bucket 中的每个 object 版本应该受到保护的时间长度。
存入 bucket 中的新 object 将继承该 bucket 设置的保护持续时间。可以为 object 版本显式地设置保留期,显式保留期为 object 版本指定保留截止日期。
“保留到日期”设置存储在对象版本的元数据中,保护 object 版本直到保留期到期。
在保留期到期后, object 版本才可以被删除,除非该 object 版本还存在其他约束。显式保留模式设置会覆盖 bucket 默认设置。
可以通过提交新的锁请求轻松地延长保留期。
在 retention 框架中,有两种模式用于设置 object 和 bucket 的保留期:
+ Governance Mode
Governance Mode 用于保护对象不被标准用户删除。但是,有些用户需要保留修改保留周期设置或删除对象所需的权限,这些用户将需要特殊权限,例如 s3:BypassGovernanceRetention 权限和 Delete object 权限。
+ Compliance Mode
Compliance Mode 的限制更大,在保留期限内不可撤销。因此,Compliance Mode可以确保在 object 的保留期内,任何人(包括root用户)都不能删除对象。 -
Legal Hold
Legal Hold提供与 object retention 相同的 WORM 保护,但没有截止日期。
这是一个无限期的保留,只能由授权用户删除。对象在具有 object retention 或 legal hold 而定义的策略时继续进行版本控制。
对 object 的某个版本进行复制操作时,不会将源 bucket 的Legal Hold和 object retention 设置转移到目标 bucket 。
提示:其他更多特性参考: MinIO 特性 。
MinIO 架构
MinIO 的架构:
MinIO 结合 Kubernetes
MinIO 与 Kubernetes 集成后,主要能提供如下功能:
- 存储类与分层
- 外部负载均衡
- 加密密钥管理
- 身份管理
- 证书管理
- 监控与告警
- 日志记录和审计
存储类和分层
在 Kubernetes 上大规模部署 MinIO 的关键要求是跨存储类( NVMe、HDD、公共云)的能力层。
MinIO 支持将老化对象从快速 NVMe 层自动过渡到更具成本效益的 HDD 层,甚至是成本更优的公有云存储层。
分层时, MinIO 在各层之间提供统一的命名空间,跨层的迁移对应用程序是透明的,并由客户策略触发。
MinIO 和 Kubernetes 通过在源头加密对象,安全可靠地实现混合和多云存储,确保客户保留对数据的完全控制。当部署在共有云中时, Kubernetes 可以跨持久性块存储和更实惠的对象存储层有效地管理数据。
外部负载平衡
MinIO 的所有通信都基于HTTP,RESTFUL API,并将支持任何标准的,兼容 Kubernetes 的入口控制器。
从而可以实现支持对接外部的nginx,实现相应的负载均衡。
加密密钥管理
建议使用 HashiCorp 保管库将密钥存储在对象存储系统之外,这是云原生应用程序的最佳实践。
建议在生产环境中的所有 bucket 上默认启用加密, MinIO 使用 AES-256-GCM 或 ChaCha20-Poly1305 加密来保护数据的完整性和机密性,对性能的影响极低。
MinIO 支持所有三种服务器端加密( SSE-KMS , SSE-S3 和 SSE-C )模式。
SSE-S3 和 SSE-KMS 与服务器端的 KMS 集成,而 SSE-C 使用客户端提供的密钥。
MinIO 支持在 KMS 中设置存储 bucket 级默认加密密钥,并支持 AWS S3 语义( SSE-S3 )。
客户端还使用 SSE-KMS 请求标头在 KMS 上指定单独的密钥。
MinIO 依靠外部 KMS 来引导其内部密钥加密服务器( KES 服务),以实现高性能的每对象加密。每个租户在隔离的命名空间中运行自己的 KES 服务器。
身份管理
通过第三方 OpenID Connect/LDAP 兼容多种身份验证(如 Keycloak , Okta/Auth0 , Google , Facebook , ActiveDirectory 和 OpenLDAP ),来管理 Kubernetes 和 MinIO 的单点登录( SSO )。
MinIO 推荐 OpenID Connect 兼容 Keycloak IDP 。
可以使用外部 IDP 集中管理用户/应用程序标识。
MinIO 增强了 IDP,提供了 AWS IAM 风格的用户、组、角色、策略和令牌服务的API。
从而可以实现独立于集群外部的身份认证的对接。
证书管理
TLS 用于加密应用程序和 MinIO 之间的所有流量,包括节点间流量。
TLS 证书可以在各连接的资源之间建立安全的网络通信。
MinIO Operator 自动为 MinIO 租户配置、 provisions 、 manages 和更新证书。
租户在自己的 Kubernetes 命名空间中彼此完全隔离,并具有自己的证书以提高安全性。
监视和警报
MinIO 建议在 Kubernetes 上运行时使用 Prometheus 进行监控和警报。
MinIO 发布所有可监测的与 Prometheus 相关的对象存储指标,从存储 bucket 容量到访问指标。这些指标可以在任何与 Prometheus 兼容的工具或 MinIO 控制台中收集和进行视化展示。
外部监测解决方案会定期抓取 MinIO Prometheus 端点。
MinIO 建议 Grafana 在 MinIO 中监控 Prometheus 指标。
同时可以配置相应的通知基线并设置警报阈值,然后可以通过 Alertmanager 将其路由到通知平台,例如 PagerDuty , Freshservice 甚至 SNMP 。
日志记录和审核
启用 MinIO 审计会为对象存储集群上的每个操作生成日志。
除了审核日志之外, MinIO 还会记录控制台错误,以便进行故障排除。
MinIO 支持将日志输出到 Elastic Stack(或其他第三方)进行分析和告警。
为了简化操作,建议对 Kubernetes 和 MinIO 使用相同的日志记录和审计工具。