Hadoop安全保护机制(Kerberos&LADP)详解

5 篇文章 0 订阅
5 篇文章 0 订阅

目录

第一章 信息安全理论基础

1.1、机密性

1.2、完整性

1.3、可用性

1.4、验证、授权和审计

1.5、统一身份认证管理

第二章 Kerberos

2.1、单点登陆

2.1.1、单点登陆概述

2.1.2、单点登陆主流技术

2.2、Kerberos核心三要素

2.3、Kerberos概览

2.4、Kerberos工作流程

2.4.1、技术版本

2.4.2、游乐园版本

2.4.3、华为KrbServer认证流程总结

第三章 LADP & LdapServer

3.1、目录服务

3.2、LDAP协议概述

3.3、LdapServer组织模型

3.4、LdapServer功能模型

3.5、LdapServer集成设计

3.5.1、身份认证架构设计

3.5.2、身份认证功能设计

3.5.3、身份认证流程设计

3.6、LdapServer应用优势

第四章 华为大数据安全认证场景架构

4.1、华为安全认证场景架构

4.2、Kerberos与Ldap业务交互原理

4.3、用户存储

4.4、集群内服务认证

4.5、常用角色部署方式

4.6、Kerberos的优缺点

4.6.1、Kerberos优势

4.6.2、Kerberos缺陷

4.7、参数和常用命令

4.7.1、参数

4.7.2、常用命令


第一章 信息安全理论基础

CIA模型:机密性、完整性和可用性

CIA模型能够帮助建议一些信息安全原则,但该模型并不是一个需要严格遵守的规划

Hadoop平台可能涉及多个CIA模型组件,也有可能一个也涉及不到

1.1、机密性

机密性:信息只应该被期望的接收者看到

身份标识:使A和B参与机密信息传递的属于自己的唯一标志

身份验证:证明自己的身份

加密:将数学算法应用于信息片段,使加密后输出内容对于非预期接收者不可读

解密:只有期望的接收者能对加密消息进行解密,从而得到原始信息

       静态加密:数据在非访问状态下就处于加密状态

       动态加密:在线加密,在数据通过网络从一个地方发送到另外一个地方时进行加密

1.2、完整性

数据完整性:保证发送方发送的信息和接收分接收的完全一致

1.3、可用性

可用性:数据能够被准确送达,不会丢失

1.4、验证、授权和审计

验证、授权和审计(AAA):指计算机安全领域的一个架构模式

在该模式中,使用服务的用户要证明自己的身份,然后规则规则被授予权限,同时其操作被记录下来留待审计

身份:指系统如何将不同的实体、用户和服务区分开来

例如用户名或用户UID

 

在一台Linux服务器上使用sudo命令:

1、通过ssh登陆,用户名/口令对被用于在/etc/passwd密码文件中验证其登陆

[root@hadoop103 ~]# ssh zph@hadoop102
zph@hadoop102's password:
Last login: Sat May 23 17:19:48 2020
[zph@hadoop102 ~]$ sudo service sshd status
[sudo] zph 的密码:
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 三 2020-08-12 23:45:13 CST; 1min 46s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 6862 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           └─6862 /usr/sbin/sshd -D

8月 12 23:45:12 hadoop102 systemd[1]: Starting OpenSSH server daemon...
8月 12 23:45:13 hadoop102 sshd[6862]: Server listening on 0.0.0.0 port 22.
8月 12 23:45:13 hadoop102 sshd[6862]: Server listening on :: port 22.
8月 12 23:45:13 hadoop102 systemd[1]: Started OpenSSH server daemon.
8月 12 23:46:43 hadoop102 sshd[7916]: Accepted password for zph from 192.1...h2
Hint: Some lines were ellipsized, use -l to show in full.
[zph@hadoop102 ~]$

2、之后是使用sudo命令获得sshd服务,这需要超级用户的权限

       这个命令执行成功,说明该用户被授予可以执行该命令

       对于sudo命令,控制哪些用户能够被授予超级用户权限的规则存储在/etc/sudoers中

[zph@hadoop102 ~]$ cat /etc/sudoers
cat: /etc/sudoers: 权限不够
[root@hadoop103 ~]# cat /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
zph     ALL=(ALL)       NOPASSWD:ALL

3、用户root被授予执行任何命令的权限,用户zoh被授予可无密码使用sudo执行任何命令的权限

       系统的验证依赖于登陆,而非一次新的验证要求

4、系统怎么知道zph是wheel用户组的一员的呢?

       /etc/group

 

zph身份的身份标识文件:

/etc/passwd:为zph的用户名分配一个特有的UID和主目录

/etc/group:进一步定义了系统的组标识以及用户和组的丛书关系

/etc/sudoers:定义了权限规则,用于验证zph是否有权限执行请求的命令

[root@hadoop103 ~]# grep zph /etc/group
wheel:x:10:zph
zph:x:1000:zph
[root@hadoop103 ~]# grep zph /etc/passwd
zph:x:1000:1000:zph:/home/zph:/bin/bash

对于用户与ssh和sudo等安全服务的互动行为,Linux会创建一个名为/var/log/secure的日志文件,该文件能够记录一个账户的某些行为,无论这些行为成功还是失败

[root@hadoop103 ~]# tail -n 6 /var/log/secure
Aug 12 23:44:47 hadoop103 sshd[7882]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 12 23:48:45 hadoop103 sshd[7969]: Accepted password for root from 192.168.3.102 port 33112 ssh2
Aug 12 23:48:45 hadoop103 sshd[7969]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 12 23:49:05 hadoop103 sudo:    root : TTY=pts/1 ; PWD=/root ; USER=root ; COMMAND=/sbin/service sshd status
Aug 12 23:49:05 hadoop103 sudo: pam_unix(sudo:session): session opened for user root by root(uid=0)
Aug 12 23:49:05 hadoop103 sudo: pam_unix(sudo:session): session closed for user root

验证:/etc/passwd

授权:/etc/sudoers、/etc/group

审计:/var/log/secure

 

1.5、统一身份认证管理

统一身份认证就类似于游乐园的通行规则一样,游客可以通过一个通行证(秘钥)来畅玩授权过的游乐项目

在开源大数据平台中,用户可能需要同时使用很多开源组件,因此会涉及到每个组件的身份认证和访问权限等问题。利用统一的认证服务能够更好的管理用户的身份认证及会话管理等

在大数据平台中通过统一用户管理系统,可以实现平台中的各种开源组件应用系统的用户、角色和组织机构统一化管理,实现各种应用系统间跨域的单点登录登出和统一的身份认证功能

统一身份认证系统的主要功能特性如下:

       用户管理

       用户认证

       单点登录

       分级管理

       权限管理

       会话管理

       兼容多种操作系统

 

目前,绝大多数厂商的统一认证管理系统都是由统一认证管理模块,统一身份认证服务器,身份信息存储服务器这三大部分组成

在华为大数据解决方案中,我们通过基于开源的OpenLDAP的身份认证的管理和存储技术以及Kerberos统一身份认证技术,实现了一种能够通过WebUI进行集群中的数据与资源访问控制权限管理

 

 

 

 

 

第二章 Kerberos

在神话中,Kerberos是Cerberus的希腊语,是一只守护地狱入口的三头犬,它确保没有人能在进入低于后离开

在技术中,Kerberos是麻省理工学院开发的一个认证机制该系统设计上采用客户端/服务器结构与DES、AES等加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证

华为大数据平台中使用KrbServer为所有组件提供了kerberos功能,可以用于防止窃听、防止replay攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统

2.1、单点登陆

2.1.1、单点登陆概述

单点登录(Single Sign On,SSO)是大数据平台的身份管理中的一部分,是指当用户访问平台的各个不同组件的过程中,通过其中一个组件的身份认证之后,在访问其他组件应用时,不需要重新登录和进行身份认证。

单点登录的特点如下:

       为用户提供便捷服务

       提高运维和管理效率

       简化应用系统的开发

2.1.2、单点登陆主流技术

单点登录主流技术:

       cookies技术

       Broker-based技术

       Agent-based技术

       Agent and Broker-based技术

       Gateway-based技术

       Token-based技术

华为大数据平台中使用Broker-based技术,通过Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术执行认证服务,从而实现平台的单点登录

2.2、Kerberos核心三要素

KrbServer认证机制的核心工作是使用一种能够证明用户身份的票据(密钥),保护集群免受窃听和重放攻击

       当提交给Hadoop一个用户名时,它会很高兴地相信你所说的一切,并且确保整个集群的所有其他机器也相信

核心三要素:

       Kerberos Client

       Kerberos KDC Server

       KDC(Key Distribution Center)

2.3、Kerberos概览

主体(principal):Kerberos中的身份标识,每个参与Kerberos认证协议的用户和服务都需要一个主体来唯一地标识自己

       用户主体(UPN):代表常规用户,类似于操作系统中的用户名

<短名称><@域>
<短名称>/admin@<域>

       服务主体(SPN):代表用户需要访问的服务,例如特定服务器上的数据库

<短名称>/<主机名>@<域>

域(realm):就是一个身份验证管理区域,所有主体都被分配到特定的Kerberos域

       域确定了边界,这使得管理更为容易

密钥分发中心(KDC)

       Kerberos数据库:存储主体及其所属域的所有相关信息

       认证服务(AS):负责在客户端向AS发起请求时,向客户端发放票据授予票据

              TGT用于请求访问其他服务

       票据授予服务(TGS):负责验证票据许可票据(TGT),并授予服务票据(ST)

              服务票据允许认证过的主体使用应用服务器提高的服务,该服务通过SPN进行标识

 

Kerberos域使用如下命名规则:

       唯一标识了Kerberos域EXAMPLE.COM中用户(短名称)zph的UPN,总为大写

zph@EXAMPLE.COM

       一种常规UPN的变形,标识了域EXAMPLE.COM中一个管理员zph

              /用于分隔短名称和管理员标识,通常约定使用admin表示管理员

zph/admin@EXAMPLE.COM

       该主体表示一个HDFS服务的SPN,该服务在Kerberos域EXAMPLE.COM中的主机node1.example.com上

              主体名是大小写敏感的,最好在主体的域部分使用大写,其他部分使用小写,SPN中涉及的主机名也用小写

hdfs/node1.example.com@EXAMPLE.COM

 

2.4、Kerberos工作流程

2.4.1、技术版本

EXAMPLE.COM:Kerberos域

zph:一个系统用户,其UPN为zph@EXAMPLE.COM

myservice:server1.example.com上运行的一个服务,其SPN为myservice/server1.example.com@EXAMPLE.COM

kdc.example.com:Kerberos域EXAMPLE.COM的KDC

 

zph想要使用myservice,需要向myservice提高一个有效的服务票据:

       1、zph需要获取一个TGT。为此,它向kdc.example.com上的AS发起一个请求,表明自己是主体zph@EXAMPLE.COM

       2、AS做出响应,为主体zph@EXAMPLE.COM提高一个使用密钥加密的TGT

       3、接收到加密信息后,zph被提示输出主体zph@EXAMPLE.COM的正确密码,从而解密信息

       4、成功解密包含TGT的信息后,zph向kdc.example.com上TGS请求服务myservice/server1.example.com@EXAMPLE.COM的一个服务票据ST,并在请求中提供出TGT信息

       5、TGS对TGT进行验证,并提供给一个使用主体myservice/server1.example.com@EXAMPLE.COM的密钥加密的服务票据ST

       6、zph现在将服务票据ST提供给myservice,myservice随后使用myservice/server1.example.com@EXAMPLE.COM的密钥对其解密,并验证票据有效性

       7、由于zph以及正确验证其身份,因此服务myservice允许其使用

2.4.2、游乐园版本

Client:集群中认证客户端——摩天轮管理员

Server:集群中认证服务器——摩天轮

KDC:密钥分发中心——票务管理处

AS:认证服务器——门卫

TGS:票据授权服务器——票据授权中心

TGT——票据许可票据——游乐园门卡

ST:服务许可票据——摩天轮授权卡

 

1、游客向门卫AS提供自己的身份证UPN,证明自己

2、门卫AS核实身份UPN,并返回给游客游乐园门卡TGT

3、游客向摩天轮管理员Client请求玩摩天轮Server,摩天轮管理员Client要求有课提供摩天轮授权卡ST:让游客拿游乐园门卡TGT到票据授权中心TGS进行验证,如果购买了,就可以拿到摩天轮授权卡ST了

4、游客找到票据授权中心TGS,给其游乐园门卡TGT,之后票据授权中心进行验证,之后返回给游客它的摩天轮授权卡ST

5、游客找到摩天轮管理员Client,给其摩天轮授权卡ST,就可以开始玩摩天轮Server了

2.4.3、华为KrbServer认证流程总结

第一步,用户首先向Kerberos认证服务器AS请求一个可以跟票据授权服务器进行通信的票据及会话密钥。用户向AS发送认证请求,请求信息包括用户唯一标识和票据授权服务器表示,申请可以跟票据授权服务器通信的票据和会话密钥。

第二步,KrbServer认证服务器AS验证该用户的唯一标识是否存储在数据库中,如果数据库中有记录,则生成一个Client—TGS会话密钥,并使用Client—AS的会话密钥加密,且生成用于用户访问TGS的票据许可票据TGT,使用票据授权服务器的密钥对其加密,并将此消息一并返回给请求的客户端用户。

第三步,用户接收认证服务器返回的信息后,解密获得用于跟票据授权服务器通话的会话密钥,然后向票据授权服务器发送用于认证的票据许可票据和访问请求消息,该访问请求消息使用Client-TGS的会话密钥加密。

第四步,票据授权服务器使用会话密钥解密接收到的消息,根据解密得到的时间戳验证用户的身份。如果验证用户身份,成功,就会产生一个用户客户端用户和服务器的会话密钥,并向用户签发许可票据ST。这些信息都使用票据授权服务器和用户之间的会话密钥进行加密。

第五步,用户解密票据授权服务器发来的信息,得到与应用服务器通信的会话密钥,并向远端应用服务器提交服务许可票据ST和用户自己生成的认证信息。

第六步,应用服务器比较用户发送的服务许可票据ST里的信息和认证信息。如果两者中包含的基本信息相同,就向用户提供相应的服务。用户接收到应用系统的确认信息后,对其解密获得时间戳并验证是否合法,从而应用服务器的身份也可以得到反向认证。

 

第三章 LADP & LdapServer

3.1、目录服务

目录服务是一个为查询、浏览和搜索而优化的服务,其类似于文件目录一样,以树形结构进行数据存储和遍历

日常生活中最常用的目录服务就是手机中的通讯录。其中通讯录是由以字母顺序排列的名字、地址和电话号码等组成,用户能够在短时间内查找到相应的用户及其信息

问题:LDAP和目录服务有哪些关系呢?

3.2、LDAP协议概述

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,是一种基于X.500目录访问协议的集中账号管理架构的实现协议标准

Ldap协议的特点如下:

  • Ldap运行在TCP/IP或其他面向连接的传输服务之上。
  • Ldap同时是一个IETF标准跟踪协议,在”轻量级目录访问协议(Ldap )技术规范路线图”RFC4510中被指定

华为大数据解决方案中,LdapServer作为目录服务系统,实现了对大数据平台的集中账号管理

LdapServer作为目录服务系统是由目录数据库和一套访问协议组成的系统:

  • LdapServer基于OpenLDAP开源技术实现。

  • LdapServer以Berkeley DB作为默认的后端数据库。

  • LdapServer是基于LDAP标准协议的一种具体开源实现

3.3、LdapServer组织模型

LdapServer组织模型又叫做LdapServer目录树或者LdapServer的命名模型,其特点如下:

 

  • LdapServer目录信息是基于树形结构来进行组织和存储的

  • LdapServer目录树中的每一个节点都被称作条目,并且拥有自己的唯一可区别的名称DN(Distinguished Name)。

  • LdapServer目录树的树根一般定义域名dc(Domain Component)

  • 域名下可以定义组织单位ou(organization unit),组织单位可以包含其他的各种对象,在目录服务系统中,组织单位包含该组织下的所有用户账户相关信息

  • 组织单位下可以定义具体对象,在定义组织对象时可以指定组织对象的名称cn(Common Name)和用户uid(User ID)

例如左下角的结点dn为:cn=stu_George,uid=001, ou=Primary school, dc=CN,dc=edu

3.4、LdapServer功能模型

华为大数据平台中的LdapServer共有10种不同类别的操作,也可以分为四类操作:

  • 查询类操作:信息搜索,信息比对

  • 更新类操作:添加条目,删除条目,修改条目,修改条目名

  • 认证类操作:认证绑定,解除认证绑定

  • 其他操作:放弃服务操作,扩展服务操作

3.5、LdapServer集成设计

3.5.1、身份认证架构设计

对于平台集成设计,在这里使用Ldap与数据仓库组件Hive进行应用举例

3.5.2、身份认证功能设计

LdapServer通过使用Group(组)和Role(角色)的身份认证方式来管理用户,从而更好地管理不同组织下的用户的属性和权限

  • Group(组):是对用户进行统一的组管理,如果用户添加到该组中,该组的member属性中就会添加成员的dn记录

  • Role(角色):是给相应的用户赋予权限,每一个用户实体都会有nsrole的属性,该属性用来为用户添加相应的角色

3.5.3、身份认证流程设计

1、创建Hive超级管理员

2、LdapServer集成用户及用户组和角色等信息

3、Hive超级管理员对LdapServer中用户进行授权等管理

4、客户端可以通过相应的认证进行相关授权连接

3.6、LdapServer应用优势

LdapServer目录服务系统提供用户账户集中管理功能优势具体如下:

 

  • LdapServer能够减少用户账户管理人员在面对用户数量大、增长快的情况下对账号的创建、回收、权限管理、安全审计等一系列复杂而繁琐工作的压力。

  • LdapServer能够解决多层次、多类型系统、数据库的安全访问难题,所有与账号相关的管理策略均配置在服务端,实现了账号的集中维护和管理。

  • LdapServer能够充分继承和利用平台组织中现有的账户管理系统的身份认证功能,并实现了账户管理与访问控制管理的分离,提高了大数据平台访问认证的安全性

 

第四章 华为大数据安全认证场景架构

4.1、华为安全认证场景架构

Step1、2、3、4:登陆Manager WebUI的流程

Step5、6、7、8:登陆组件UI的流程

Step9:组件间访问安全认证

Kerberos1对Ldap中数据的操作方式:访问Ldap1(主备)和Ladp2(主备),是采用负荷分担访问,数据的写操作只能在Ldap2(主)上,数据的读操作可以在Ldap1或Ldap2上

Kerberos2对Ladp中数据的操作方式:只能访问Ldap2(主备),数据的写操作只能在Ldap2(主)

4.2、Kerberos与Ldap业务交互原理

Kerberos作为认证服务器中心,向集群内所有服务以及客户的二次开发应用提供统一的认证服务

Ldap作为用户数据存储中心,存储了集群内用户的信息,包含密码,附属信息等

统一认证的过程中,Kerberos的所有数据,包含用户的密码,用户的附属信息(例如用户归属组信息)均需要从Ldap获取

每一次的认证业务,Kerberos均需要从Ldap中获取用户信息

4.3、用户存储

Ldap主要提供用户数据存储功能,其中包含集群内的默认用户(例如admin用户),客户创建的用户(例如通过UI界面创建一个用户)

存储了用户的两个关键信息,分别是Kerberos信息和Ldap信息

  • Kerberos信息主要包含用户的用户名,密码信息,对Kerberos提供认证查询功能,即密码的校验功能。

  • Ldap信息主要包含用户的附属信息,例如:用户类别,用户组信息,角色信息,邮箱等。对外提供鉴权功能,即权限的识别,例如该用户是否具有访问HDFS某个文件目录的权限

4.4、集群内服务认证

Kerberos服务在集群中是一个基础组件模块,在安全模式下,所有的业务组件都需要依赖Kerberos服务(组件),业务组件(如HDFS)在对外提供业务的过程中,均需要先通过Kerberos的认证服务,如果无法通过Kerberos认证,将无法获取该业务组件的任何业务服务

LdapServer作为Kerberos的数据存储模块,与其他所有的业务组件(除Kerberos服务)均不直接交互。

集群内某个服务(如HDFS)prestart的时候,会预先去Kerberos中获取该服务对应的服务名称sessionkey(keytab,主要是提供给应用程序进行身份认证使用),在后续任意其他服务(如YARN)需要去HDFS中执行增/删/改/查数据时,必须获取到对应的TGT和ST,用于本次的安全访问

4.5、常用角色部署方式

Kerberos服务角色:KerberosServer、KerberosAdmin。

       KerberosServer对外提供认证功能,KerberosAdmin对外提供用户管理(用户的增,删,改)功能。

Kerberos服务采用负荷分担模式部署,安装的时候,需将Kerberos服务选择到集群内两个控制节点。

LdapServer服务角色:SlapdServer。

LdapServer服务采用主备模式部署,安装的时候,需将LdapServer服务选择到集群内两个控制节点。

考虑性能最优化,建议所有集群中LdapServer都与KrbServer部署在相同节点上

4.6、Kerberos的优缺点

4.6.1、Kerberos优势

能够防止暴力破解:用于认证的Session key是short term key,只在一次会话中有效。

防止重放攻击:每个请求都以时间戳进行标记。

双向鉴别:Kerboers支持双向鉴别,这也是Kerboers优于NTLM之处。Kerboers的Server端通过返回Client发送的时间戳,向Client提供验证自己身份的手段。

较高的性能:

  • 从KRB_AS_REP以及KRB_TGS_REP看到,KDC把认证Client身份的相关信息,主要是会话密钥和被加密的Client身份信息(TGTc和Session Ticket)都发送给了Client,由Client进行保管。这样做减少了Server和KDC的存储压力。

  • 由Client统一发送Authenticator和Session Ticket而不是由KDC代为发送,减少了KDC压力并且可以防止两者不能同步到达Server而引起的认证失败。

4.6.2、Kerberos缺陷

AS Exchange过程中,AS向Client响应请求时仍然用客户端的Master key进行加密了。因此,客户端的Master Key依然被用于加密并传输。由于AS授予Client的TGT是由生命期的,所以TGT的生命期结束,Client势必要向AS重新发送KRB_AS_REQ,造成Master key在网络中被多次传输

KDC要保存大量的密钥,维护KDC的Account database开销很大

Kerboers防止重放攻击的手段是时间戳。然而,在分布式系统中,严格的时间同步是困难的,错误的时间同步导致认证的失败。因此攻击者可以通过干扰时间系统来达到攻击的目的

4.7、参数和常用命令

4.7.1、参数

KADMIN_PORT:kadmin服务提供用户管理的端口

Kdc_ports:kdc服务实例的端口

Kdc_timout:kdc提供认证服务的超时时长

KPASSWD_PORT:kadmin提供密码管理的端口

LDAP_OPTION_TIMEOUT:Kerberos对后端LDAP数据库进行连接的超时时长,连接操作时间超过该值,Kerberos返回失败

LDAP_SEARCH_TIMEOUT:Kerberos对后端LDAP数据库进行操作的查询时长,查询操作时间超过该值,Kerberos返回失败

max_retries:JDK进程连接KDC进行认证的最大次数,如果连接次数超过设定值,返回失败

4.7.2、常用命令

ldapsearch:系统自带的Ldap客户端命令工具,查询Ldap中的用户信息

ldapadd:系统自带的Ldap客户端命令工具,向Ldap中的添加用户信息

ldapdelete:系统自带的Ldap客户端命令工具,删除Ldap中的用户信息

kinit:Kerberos用户身份认证,只有通过身份认证的用户才能执行MRS各组件的shell命令,完成组件的维护任务

kdestroy:Kerberos用户身份注销,完成组件任务后使用

kadmin:切换至kerberos admin用户,拥有admin权限,该用户可以获取、修改kerberos 用户信息

kpasswd:修改Kerberos用户密码

klist:列出当前通过身份认证的Kerberos用户

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值