首页 > 编程语言 >PG14:auth_delay 插件源码分析

PG14:auth_delay 插件源码分析

时间:2024-03-14 17:36:39浏览次数:24  
标签:插件 函数 PG14 auth delay hook 源码 ClientAuthentication milliseconds

auth_delay 让服务器在报告身份验证失败前短暂暂停,以增加对数据库密码进行暴力破解的难度。需要注意的是,这对阻止拒绝服务攻击毫无帮助,甚至可能加剧攻击,因为在报告身份验证失败前等待的进程仍会占用连接。

要使用这个模块必须要在 postgresql.conf 中配置参数

shared_preload_libraries = 'auth_delay'
auth_delay.milliseconds = '500'

这个代码比较简单,一共分为三个部分。

  1. hook 函数

在 libpq 中定义了一个 ClientAuthentication_hook 函数指针,代码如下:

typedef void (*ClientAuthentication_hook_type) (Port *, int);

/*
 * This hook allows plugins to get control following client authentication,
 * but before the user has been informed about the results.  It could be used
 * to record login events, insert a delay after failed authentication, etc.
 */
ClientAuthentication_hook_type ClientAuthentication_hook = NULL;

  1. _PG_init 函数
void
_PG_init(void)
{
	/* Define custom GUC variables */
	DefineCustomIntVariable("auth_delay.milliseconds",
							"Milliseconds to delay before reporting authentication failure",
							NULL,
							&auth_delay_milliseconds,
							0,
							0, INT_MAX / 1000,
							PGC_SIGHUP,
							GUC_UNIT_MS,
							NULL,
							NULL,
							NULL);
	/* Install Hooks */
	original_client_auth_hook = ClientAuthentication_hook;
	ClientAuthentication_hook = auth_delay_checks;
}

这个 _PG_init 函数会在模块调用之前执行,这个函数主要实现的功能是定义了一个 GUC 参数 auth_delay.milliseconds 这个参数我们需要在 postgresql.conf 中进行配置,然后它将原来的钩子函数保存在了 original_client_auth_hook 变量中,然后将我们自己的 auth_delay_checks 函数赋给了 ClientAuthentication_hook 变量,这样我们就可以让数据库调用我们的函数了。

  1. auth_delay_checks 函数
static void
auth_delay_checks(Port *port, int status)
{
	/*
	 * Any other plugins which use ClientAuthentication_hook.
	 */
	if (original_client_auth_hook)
		original_client_auth_hook(port, status);

	/*
	 * Inject a short delay if authentication failed.
	 */
	if (status != STATUS_OK)
	{
		pg_usleep(1000L * auth_delay_milliseconds);
	}
}

这个函数的意思是如果原来存在有钩子函数就先运行原来的钩子函数,然后我们看一下验证的状态 status 是不是正确,如果不正确,就延时 auth_delay_milliseconds 个时间。

标签:插件,函数,PG14,auth,delay,hook,源码,ClientAuthentication,milliseconds
From: https://www.cnblogs.com/zardfans/p/18073228

相关文章

  • 远程办公、企业内网服务器的Code-Server上如何配置使用CodeGeeX插件
    很多小伙伴都会在工作中使用code-server,比如说远程办公,当你需要在家访问你的工作环境,亦或者是你们公司的Docker是放入服务器中。code-server无疑是最好的选择,它可以让你通过互联网安全地连接到远程服务器上的开发环境并且使用VSCode。这也符合code-server的初衷——能够在任何......
  • 基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
    ......
  • java毕设安卓基于Android的志愿者服务系统(开题+源码)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今信息化社会,移动互联网技术的迅猛发展正深刻改变着人们的生活方式。特别是在社会公益领域,志愿者服务作为社会文明进步的重要标志,其组织与管......
  • 学生考勤系统|基于Springboot的大学生考勤系统设计与实现(源码+数据库+文档)
    大学生考勤系统目录目录基于Springboot的大学生考勤系统设计与实现一、前言二、系统功能设计三、系统实现1、系统登录注册2、管理员功能模块四、数据库设计1、实体ER图 2、具体的表设计如下所示:五、核心代码 六、论文参考 七、最新计算机毕设选题推荐八、源码......
  • openGauss SQL引擎插件开发指导
    开发流程①在openGauss社区Plugin仓进行兼容性相关开发(https://gitee.com/opengauss/Plugin)②通过fastcheck自测以及CI门禁③提供checkin测试报告和开发文档并通过SIG组评审开发要点开放接口函数DLL_PUBLICPG_FUNCTION_INFO_V1_PUBLIC统一管理为了避免......
  • 基于java+springboot+vue实现的物业管理系统(文末源码+Lw+ppt)23-23
    摘  要快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,通过线上物业管理系统也就相继涌现。与此同时,人们开始接受方便的生活方式。他们不仅希望页面简单大方,还希望操作方便,可以快......
  • 基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个停车场管......
  • 基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个停车场管......
  • 基于java+springboot+vue实现的美食网站系统(文末源码+Lw+ppt)23-55
    摘   要互联网的兴起从本质上改变了整个社会对信息的管理方式,我国从上个世纪90年代互联网兴起之时,就产生了通过网络进行系统管理的想法。但是由于在互联网上的信誉难以认证、网络的法规政策不健全等一系列的原因,限制了网上信息管理发展的步伐。进入21世纪以后,随着整个社会......
  • openGauss SQL引擎插件开发指导
    开发流程①在openGauss社区Plugin仓进行兼容性相关开发(https://gitee.com/opengauss/Plugin)②通过fastcheck自测以及CI门禁③提供checkin测试报告和开发文档并通过SIG组评审开发要点开放接口函数DLL_PUBLICPG_FUNCTION_INFO_V1_PUBLIC统一管理为了避免......