OpenWrt系统安全改进<三> --- Web UI密码错误控制

OpenWrt系统安全改进<二>中所做的尝试,是为了增强用户登录的鉴权机制(密码输错三次就禁用用户一段时间),PAM可以实现对用户登录的控制,但是进一步操作中发现WebUI的登录并没有支持PAM,前功尽弃......
了解了一下OpenWrt的luci机制,参见http://www.360doc.com/content/14/0312/20/1964482_360072189.shtml,简单来说,就是使用uhttpd来解析http报文,一些具体的操作都由lua来实现。
本来是想修改uhttpd来实现这个功能,但是抓包看了一下,uhttpd并不关心luc程序的操作结果,虽然能够识别到用户登录,但是要获取密码认证结果却并不方便,于是只好硬着头皮上lua。
 
下面是最基本的实现,多用户,信息安全都没有考虑,以后可以改进一下。
另外,密码输错三次后,用户继续输入,返回在web页面的信息还是密码错误而不是用户被限制,也需要修改。

 

FORBIDEN_EXPIRE = 180
MAX_TRY = 3

local UserErrorCount = 0
local UserForbidenTime = 0

function writeErrCount(username,count)
    os.execute("echo %s > /var/ErrCount" % count)
end

function readErrCount(username)
	if fs.access("/var/ErrCount") then
		return (tonumber(fs.readfile("/var/ErrCount")))
	else 
		return 0
	end
end

function writeForbidenTime(username,ftime)
    os.execute("echo %s > /var/ForbidenTime" % ftime)
end

function readForbidenTime(username)
	if fs.access("/var/ForbidenTime") then
		return (tonumber(fs.readfile("/var/ForbidenTime")))
	else 
		return 0
	end
end

function fnsrDbg(string)
	os.execute("echo %s >> /luaDbg" % string)
end

function isForbidenExpired(username)
	curTime = uptime()
	UserForbidenTime = readForbidenTime(username)

	if curTime - UserForbidenTime > FORBIDEN_EXPIRE then
		fnsrDbg("Forbiden Expired")
		return true
	else
		fnsrDbg("Forbiden Not Expired")
		return false
	end

end

function isAllowed(username)
	if readForbidenTime(username) == 0 then
		fnsrDbg("UserAllowed")
		return true
	else
		if isForbidenExpired(username) then
			writeForbidenTime(username,0)
			fnsrDbg("UserAllowed After ForbidenExpired")
			return true
		end
	end

	fnsrDbg("User Not Allowed")
	return false
end

function updateAllowed(username,validate)
	if validate then
		writeErrCount(username,0)
	else
		UserErrorCount = readErrCount(username)
		UserErrorCount = UserErrorCount + 1
		writeErrCount(username,UserErrorCount)

		if UserErrorCount == MAX_TRY then
			UserAllowed = false
			writeErrCount(username,0)
			writeForbidenTime(username,uptime())
		end
	end
end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值