阿里云-CentOS Linux 7安全基线检查

阿里云-CentOS Linux 7安全基线检查,第1张

1、检查项目 : 设置密码失效时间

加固建议: 在 /etc/login.defs 中将 PASS_MAX_DAYS 参数设置为 60-180之间,如 PASS_MAX_DAYS 90。需同时执行命令设置root密码失效时间: $ chage --maxdays 90 root。

chage -l root  //查询用户的密码到期时间等信息

2、检查项目 : 设置密码修改最小间隔时间

加固建议: 在 /etc/login.defs 中将 PASS_MIN_DAYS 参数设置为5-14之间,建议为7:  PASS_MIN_DAYS 7 需同时执行命令为root用户设置:  $ chage --mindays 7 root

3、检查项目 : 禁止SSH空密码用户登录

加固建议: 在/etc/ssh/sshd_config中取消PermitEmptyPasswords no注释符号#

4、检查项目 : 确保SSH MaxAuthTries设置为3到6之间

加固建议: 在vi /etc/ssh/sshd_config中

取消MaxAuthTries注释符号#,设置最大密码尝试失败次数3-6,建议为5:MaxAuthTries 5

5、检查项目 : SSHD强制使用V2安全协议

加固建议: 编辑vi /etc/ssh/sshd_config

文件以按如下方式设置参数:Protocol 2

6、检查项目 : 设置SSH空闲超时退出时间

加固建议: 编辑vi /etc/ssh/sshd_config

将ClientAliveInterval 设置为300到900,即5-15分钟,

将ClientAliveCountMax设置为0。

ClientAliveInterval 900   ClientAliveCountMax 0

7、检查项目 : 确保SSH LogLevel设置为INFO

加固建议: 编辑vi /etc/ssh/sshd_config 文件以按如下方式设置参数(取消注释): LogLevel INFO

8、检查项目 : 设置用户权限配置文件的权限

加固建议: 执行以下5条命令

chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow

chmod 0644 /etc/group

chmod 0644 /etc/passwd

chmod 0400 /etc/shadow

chmod 0400 /etc/gshadow

LinuxC++编写线程安全库dll的方法:

1、动态库只有一个导出函数

这种情况下编写函数时,只需要考虑不要有冲突的全局数据就可以了。这里的全局数据包括了在堆中分配的数据块和静态全局变量等。如果存在这样的全局数据,那么进程中的不同线程访问这个函数就会造成冲突。

2、动态库导出了多个函数,而且多个函数间存在数据传递。

一般DLL都导出多个函数,一个初始化,一个资源释放,其他为核心功能函数。这些函数间极有可能发生数据传递。如果一个初始化函数是在线程A中调用的,而核心功能函数是在线程B中调用的,那么线程A初始化函数的资源就无法对应线程B中的核心功能,此外还有核心功能函数间的数据传递,这样的DLL就不是线程安全的,必然导致错误。

解决办法是由用户(即使用DLL的人)保证这些导出函数是在一个线程中调用。但这样会很大程度上限制接口的设计和用户的使用自由度。所以最好的方法是函数只管自己的线程安全,不同函数传递数据用动态TLS,线程局部存储。

3、限制访问DLL中某一函数的线程数目。

对于DLL中的某一个函数的访问线程数目是有限制的,超过了限制其他线程就得等一定的时间,一定的时间过后如果还不能得到执行机会,那就返回超时。这样的设计对用户来说是友好的,而且很实用,有的商业程序确实是按照允许用户访问的通道数目来计价的。

对DLL中的函数做这样的一个封装,一般是简单的待用Semaphore信号量,来解决。DLL初始化时调用CreateSemaphore函数对信号量进行初始化,其原型如下:

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

// pointer to security attributes

LONG lInitialCount, // initial count

LONG lMaximumCount, // maximum count

LPCTSTR lpName // pointer to semaphore-object name

)

对于信号量,它每WaitForSingleObject一次(当然是要进入),其状态值(一个整数)就减1,使用完ReleaseSemaphore其状态值就加1,当其状态值为0时信号量就由有信号变为无信号。利用信号量的这一特性,我们在初始化时将信号量的初始值(第2个参数)设置为限制的线程访问数目。在要限制访问线程数目的函数内部,通过调用WaitForSingleOject获取控制权,并指定一个等待时间(这个由配置文件指定),根据情况超时返回,使用完ReleaseSemaphore释放对占用,让其他线程可以调用这个函数。

4、多进程情况下的多线程安全DLL。

LL是可以被多个进行加载并调用的。那就是说如果我们只对一个进程进行了限制,那么在多进程调用的情况下,这样的限制被轻易攻破。

我们都知道,Semaphore信号量属于内核对象,也就是说其可以被多进程共享访问,也就说,如果我们给一个Semaphore指定了一个名字,在另一个进程中,我们只要调用OpenSemaphore函数用同一名字打开信号量就可以访问了。这样问题就解决了?

现实情况是,多进程情况下,一般不是简单的多进程共享一个Semaphore就可以了。多进程间需要互通很多信息。一般的解决办法是,采用共享数据段。

#pragma data_seg("share")

int share_data

#pragma data_seg()

#pragma comment(linker,"/SECTION:share, RWS")

通过pragam编译器指令生成了一个名叫share的共享数据段,这样对于变量share_data就可以多进程共享的了。如果要多进程间交换数据,只要在data_seg中添加数据定义即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7362660.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存