精华内容
下载资源
问答
  • 数据库加固
    2019-03-08 15:32:00

    收集整理比较全面的MYSQL数据库加固

    MYSQL数据库加固指导手册

    1. 数据库存放位置检查

    • windows系统: 数据库不可以放在C盘
    • linux系统:数据库文件不可以存放在 /,/var,/usr目录内
    #连上mysql数据,mysql -uroot -p --回车输入密码
    
    select @@datadir;
    #或
    
    show variables where variable_name='datadir';
    

    加固方法

    #设置指定安全的路径
    set global datadir='路径' ;
    #或者修改配置文件my.cnf(linux)或my.init(windows)中的datadir值
    datadir='路径'

    2. 最小权限账号运行MYSQL数据库

    • windows系统:打开任务管理器,查看运行mysql的是什么权限账号,不能是administrator
    • linux系统: 不是是高权限账号(root)运行mysql,也不可以是在高权限用户组内
    #ps 命令查看进程 ,grep过滤结果,使用下面命令查看运行mysql的用户
    ps -ef | grep mysql

    加固方法

    # 1. 创建低权限账号和组
    groupadd mysql
    useradd -r -g mysql mysql
    # 2. 给新建账号添加密码
    passwd mysql
    # 3. 修改MYSQL安装目录的权限(提前关闭mysql服务)
    chown -R mysl.mysql  mysql安装路径
    # 4. 读写执行权限最小化755
    chmod 755 mysql安装根路径
    chmod 755 mysql安装后执行目录(bin)
    chmod 755 mysql安装后lib库(libexec)
    chmod -R go-rwx mysql数据存储目录(data)
    # 5.重启mysql服务即可
    service mysqld start

    3. 禁用使用mysql命令行历史记录

    • 查看系统中是存在.mysql_history文件:find / -name ".mysql_history" ,存在表示需要加固

    加固方法

    echo "export MYSQL_HISTORY=dev/null" >> /etc/profile
    ln -s /dev/null  .mysql_history文件路径
    rm -r .mysql_history文件路径

    4.控制慢查询日志文件的权限

    • 查看慢查询日志文件名称和路径,然后查看权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
    • 如果没有开启慢查询,表示安全
    ### 第一种方法
    #1. 查看慢查询日志文件名称和路径
    select @@slow_query_log_file;
    #或者
    show variables like 'slow_query_log_file';
    #2. 查看是否开启慢查询, slow_query_log 值:ON表示开启,OFF表示关闭
    show variables like '%query%';
     
     ### 第二种方法,直接查看mysql配置文件 /etc/my.cnf
     cat /etc/my.cnf
     #看[mysqld]下面是否有以下配置:
     logout=file
     slow_query_log=on
     slow_query_log_file=路径
     long_query_time=2
    
     #3. 查看慢查询日志文件的权限
     ls -l 慢查询日志文件路径
    

    加固方法

    #修改慢查询日志权限如下
    chmod 660 慢查询日志文件
    chmod msyql.mysql 慢查询日志文件

    5. 控制通用日志文件的权限

    • 查看通用日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
    • 如果没有开启慢查询,表示安全
    #1. 查看是否开始通用日志记录,如果general_log为ON表示开启,否者就是关闭,其中general_log_file是通用日志的存放位置
    show variables like '%general%';
    
    #2. 根据第一步查看获取日志文件的位置查看通用日志文件的权限
    ls -l 通用日志文件

    加固方法

    #修改权限和所属权限
    chmod 660 <log file>
    chown mysql:mysql <log file>
    

    6. 审计日志文件的权限控制

    • 查看 审计日志文件名字和权限,日志文件权限应满足:chmoed 660 和chmod mysq.mysql
    • 如果没有开启慢查询,表示安全
    #查看文件路径
    show variables like '%audit_log_file%';
    
    # 查看权限
    ls -l 审计日志文件

    加固方法

    #修改权限和所属权限
    chmod 660 <log file>
    chown mysql:mysql <log file>

    7. 查看MYSQL版本,是否需要进行打补丁

    show variables like 'version';

    加固方法

    • 安装补丁
    • 升级到mysql 最新版本

    8. 删除test数据库

    • 如果存在test默认数据库,需要进行删除做加固
    • 如果没有,就不需要加固
    #1. 查看系统数据库
    show databases;
    

    加固方法

    drop database test;

    9. 读取本地文件设置为OFF

    • 确认mysql数据库关闭对本地文件的读取功能,local_infile应为OFF
    # 查看是否开启本地读取文件功能
    show variables like 'local_infile'
    

    加固方法

    # 临时设置
    set @@local_infile=0;
    #永久设置,修改/etc/my.cnf 加入local-infile=0
    在[mysqld]下面加入
    local-infile=0

    10 .确认只有管理员权限可以管理所有表,查看所有用户和用户密码哈希,权限修改

    # 1. 查看所有数据库用户
    select user,host from mysql.user;
    
    # 2. 执行以下两条语句确保结果智能是数据库管理员
    SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
    OR (Delete_priv = 'Y')  OR (Create_priv = 'Y')  OR (Drop_priv = 'Y');
    SELECT user, host FROM mysql.db WHERE db = 'mysql' AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
    

    加固方法

    # 1. 确保一个数据库使用一个用户(尽可能的每个数据库使用单独的用户),每个用户只能对自己的库和表有全部权限,对其他库表根据情况有部分权限
    # 2. 确保权限管理只能是管理员
    ## 授权操作 :授予xiaoming用户对数据库test的goods表privileges权限
    grant privileges on test.goods to xiaoming@localhost
    
    privileges:表示要授予什么权力,例如可以有 select , insert ,delete,update等,如果要授予全部权力,则填 ALL
    atabasename.tablename:表示用户的权限能用在哪个库的哪个表中,如果想要用户的权限很作用于所有的数据库所有的表,则填 *.*,*是一个通配符,表示全部。
    username@host:表示授权给哪个用户。
    GRANT  select,insert  ON  zje.zje  TO 'aaa'@'%';         //表示给用户aaa授权,让aaa能给zje库中的zje表 实行 insert 和 select。
    
    GRANT  ALL  ON  *.*  TO  'aaa'@'%';//表示给用户aaa授权,让aaa能给所有库所有表实行所有的权力。
    
    ## 删除无关用户
    drop user 'test'@'%'; #删除 test用户
    
    ### 撤销用户权限
    revoke privileges ON  database.tablename  FROM  'username'@'host';
    privileges,database.tablename,'username'@'host'同上
    
    根据实际情况对数据库用户进行权限的回收

    11. 限制非管理权限

    file_priv:表示是否允许用户读取数据库所在主机的本地文件;
    
    Process:表示是否允许用户查询所有用户的命令执行信息;
    
    Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
    
    Shutdown_priv:表示用户是否可以关闭数据库;
    
    Create_user_priv:表示用户是否可以创建或删除其他用户;
    
    Grant_priv:表示用户是否可以修改其他用户的权限;
    
    应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
    
    select user, host from mysql.user where File_priv = 'Y';
    
    select user, host from mysql.user where Process_priv = 'Y';
    
    select user, host from mysql.user where Process_priv = 'Y';
    
    SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';
    
    SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';
    
    SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';
    SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';
    

    加固方法

    # 回收权限
    REVOKE FILE ON *.* FROM '<user>';
    
    REVOKE PROCESS ON *.* FROM '<user>';
    
    REVOKE SUPER ON *.* FROM '<user>';
    
    REVOKE SHUTDOWN ON *.* FROM '<user>';
    
    REVOKE CREATE USER ON *.* FROM '<user>';
    
    REVOKE GRANT OPTION ON *.* FROM <user>;
    
    其中user为上述查询到的非管理员用户。
    例如:回收用户xiaoming的本地文件读取权限
    revoke file on *.* from 'xiaoming';

    12. 合理控制DML/DDL操作授权

    • DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:
    SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y' OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'
    OR Drop_priv='Y' OR Alter_priv='Y';

    加固方法

    REVOKE SELECT ON <host>.<database> FROM <user>;
    REVOKE INSERT ON <host>.<database> FROM <user>;
    REVOKE UPDATE ON <host>.<database> FROM <user>;
    REVOKE DELETE ON <host>.<database> FROM <user>;
    REVOKE CREATE ON <host>.<database> FROM <user>;
    REVOKE DROP ON <host>.<database> FROM <user>;
    REVOKE ALTER ON <host>.<database> FROM <user>;
    #其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。

    13. 开启错误日志审计功能

    • 错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
    show variables like 'log_error';
    #确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。

    加固方法

    #在/etc/my.cnf加入配置
    [mysqld_safe]
    log-error=log文件路径
    

    14. 确保日志存放在非系统区域

    • 日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
    show variables like 'log_error';
    #或者直接去mysql文件查看 /etc/my.cnf log-error的值
    #确保返回结果不是如下路径:/、/var、/usr

    加固方法

    #修改mysql配置文件log-error值不是 / ,/var/ ,/usr下
    

    15. 关闭原始日志功能

    • 原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
    #查看配置文件中是否有 log-raw=OFF或者log-raw=0
    cat /etc/my.cnf

    加固方法

    #修改mysql 配置文件 /etc/my.cnf 加入 log-raw=0
    [mysqld_safe]
    log-raw=1

    16. 用户密码加密强度

    • old_passwords的值不能为0,如果为0则用户密码可被破解
    select @@old_passwpords;
    #值为0表示需要加固,否则不需要加固

    加固方法

    
    set global old_passwords=1;
    #或者
    set global old_passwords=2;
    ## 或者修改/etc/my.cnf  加入old_passwords=1
    [mysqld_safe]
    old_passords=1 #或者等于2

    17. secure_auth 选项设置

    • 如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。
    #查看配置文件中是否有 secure_auth 并且值不为0
    cat /etc/my.cnf

    加固方法

    ## 或者修改/etc/my.cnf  加入secure_auth=1
    [mysqld_safe]
    secure_auth=1 #或者等于2

    18.确保所有用户都要求使用非空密码登录

    • 执行如下语句查询是否有用户不需要密码即可登录:
    SELECT User,host FROM mysql.user WHERE (plugin IN('mysql_native_password', 'mysql_old_password') AND (LENGTH(Password) = 0 OR Password IS NULL))OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);
    #如果没有返回用户表示不存在
    #或者使用以下语句查看是否有空密码
    select user,host from msyql.user;

    加固方法

    #对空口零的用户加入密码user的值指定用户, password('')对用户密码加密,new password指定用户的密码
    update mysql.user set password=password('new password') where user='root';

    19. 数据库定时备份

    • 定时对数据备份,异地备份,全量备份

    加固方法

    # 创建定时任务脚本,指定时间间隔对数据备份
    # 例子:

    a.新建备份文件并赋予可以执行的权限

    mkdir -p /home/mysql_backup/
    touch /home/mysql_backup/mysql_backup.sh
    chmod 551 /home/mysql_backup/mysql_backup.sh

    b.编辑/home/mysql_backup/mysql_backup.sh

    vim /home/mysql_backup/mysql_backup.sh

    c.写入以下内容

    backupdir=/home/mysql_backup
    time=` date +%Y_%m_%d_%H_%M_%S `
    db_user=root
    db_pass=123456
    mysqldump --all-databases -u $db_user -p$db_pass | gzip > $backupdir/$time.sql.gz
    find $backupdir -name "*.sql.gz" -type f -mtime +5 -exec rm -rf {} \; > /dev/null 2>&1

    d.编辑crontab

    crontab -e

    e.在最后一行加入

    * */1 * * * root /home/mysql_backup/mysql_backup.sh

    f.重启crontab

    service crond restart
    

    转载于:https://www.cnblogs.com/ssjt/articles/10496147.html

    更多相关内容
  • 数据库加固

    2018-01-15 17:56:48
    oracle和mysql的数据库加固,亲测很好用,有什么不懂私聊我就可以
  • oracle数据库加固

    2015-03-26 19:01:43
    oracle数据库加固文档,实现oracle层面的加固
  • Oracle数据库加固.doc

    2022-04-08 17:42:46
    Oracle数据库加固
  • 我们都知道密码策略加固的参数一般包括密码长度、复杂度检测、最大最小使用时间、过期警报时间、最大登录失败次数以及锁定时间等设置。Oracle默认提供了一个密码策略的sql执行文件utlpwdmg.sql。linux/unix默认路径...
  • Oracle数据库加固之密码策略
  • 数据库加固--mariadb

    2021-12-14 17:57:36
    查看并配置数据库存放路径权限 登录数据库 mysql -u root -p 查看数据存放路径 show variables where variable_name = 'datadir'; 退出 quit 查看数据库存放路径权限 ls -l /var/lib | grep mysql ...

     mariadb安全配置

    一、操作系统级权限检查

    查看并配置数据库存放路径权限

    登录数据库

    mysql -u root -p

     查看数据存放路径

    show variables where variable_name = 'datadir';

    退出 quit

    查看数据库存放路径权限

    ls -l /var/lib | grep mysql

     建议将权限改为700

    chmod 700 /var/lib/mysql

     二、数据库的通用安全配置

    1.删除默认的test数据库

    DROP DATABASE 'test';

    2.禁用local_infile参数

    查看local_infile参数是否开启

    show variables where variable_name = 'local_infile';

    若为开启,编辑 /etc/my.cnf 文件 在mysqld一项中添加(需重启数据库方能生效)

    local_infile=0
    

    3.修改secure_file_priv参数

    查看secure_file_priv参数

    SHOW GLOBAL VARIABLES WHERE Variable_name = 'secure_file_priv' ;

     

    若显示为空,表示所有路径,建议设为固定值 。编辑 /etc/my.cnf 文件 在mysqld一项中添加(需重启数据库方能生效)

    secure_file_priv=/www/server
    

     4.确定只有root用户有内置数据库mysql的权限

    查看内置数据库权限

    SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');

     5.查看file_priv权限,确定只有root用户有

    select user, host from mysql.user where file_priv = 'Y';

     6.配置允许用户登录的主机

    查看当前用户可以登录的主机

    select user,host from mysql.user;

     更新用户允许登录的主机

    update mysql.user set host="IP" where host="localhost" and user="root";

    展开全文
  • 数据库加固方案

    千次阅读 2018-02-02 13:33:24
    mysql和oracle数据库加固

    oracle部分

    账户权限加固

    1.1.1 删除或锁定无效账号

    必须以DBA身份登录才有修改权限

    l   删除用户:

    SQL>DROPUSER USERNAME CASCADE;

    l   锁定用户:

    SQL>ALTER USER USERNAME ACCOUNT LOCK;

    锁定除SYS、SYSTEM、DBSNMP,SYSMAN,MGMT_VIEW和业务以及维护用的帐号以外所有其他的帐号。 如果不需要使用EM(Enterprise Manager)则还可以锁定DBSNMP,SYSMAN,MGMT_VIEW三个帐号。

    1.1.2 权限最小化

             限制应用用户在数据库中的权限,尽量保证最小化,避免授予DBA权限。

    查看权限:

    SQL>select *from user_sys_privs;

    SQL>select *from user_role_privs;

    SQL>select *from user_table_privs;

    赋予用户权限

    SQL>grant 权限 to username;

    收回用户权限

    SQL> revoke 权限 from username;

    1.1.3 撤销public角色的程序包执行权限

    A. 查看public 角色的程序包执行权限

    SQL> SELECT  TABLE_NAME FROM DBA_TAB_PRIVS WHEREGRANTEE=’PUBLIC’ AND PRIVILEGE=’EXECUTE’;

     

    B. 撤销public 角色的程序包执行权限

     

    例如:

    SQL>REVOKE EXECUTE ON UTL_FILE FROMPUBLIC;

     

    Oracle 官方建议撤销public角色对utl_file,utl_http,utl_tcp,utl_smtp,dbms_random程序包的执行权限。

     

    用户组PUBLIC,表示数据库中的每一位用户,因此,对PUBLIC用户组授予权限其实也就是对数据库中的每一位用户都授予了相应的权限。这是在授予或撤销权限时非常有用的一条捷径。但也可能带来巨大的安全隐患,尤其是在试图确保以最少权限的方式运行数据库

    时,更是如此。

      

    撤销Public 组的一些不必要权限,严格限制以下程序包的权限:

      

    UTL_FILE:该程序包允许oralce 用户读取服务器上的文件,如果设置错误的话,可能可以得到任何文件。

      

    UTL_HTTP:该程序包允许oracle 用户通过HTTP 访问外部资源包括恶意的web 代码和文件。

      

    UTL_TCP: 该程序包允许oracle 通过TCP 建立连接,从而从网络上得到可执行文件。

      

    UTL_SMTP: 该程序包允许oracle 通过SMTP 方式进行通信,从而转发关键文件。

      

    撤销以上包的执行权限:

     

    Sql  

    revoke EXECUTE on UTL_FILE from public;  

    revoke EXECUTE on UTL_TCP from public;  

    revoke EXECUTE on UTL_SMTP from public;  

    revoke EXECUTE on UTL_HTTP from public; 

    1.1.4 修改系统账户的默认口令

    SQL>ALTER USER SYS IDENTIFIED BY<NEWPASSWORD>;

    SQL>ALTER USER SYSTEM IDENTIFIED BY<NEWPASSWORD>;

     

    1.1.5 密码策略设置

           Oracle中与密码策略有关的配置项如下:

    FAILED_LOGIN_ATTEMPTS:        最大错误登录次数

    PASSWORD_GRACE_TIME:         口令失效后锁定时间

    PASSWORD_LIFE_TIME:            口令有效时间

    PASSWORD_LOCK_TIME:           登录超过有效次数锁定时间

    PASSWORD_REUSE_MAX:          口令历史记录保留次数

    PASSWORD_REUSE_TIME:          口令历史记录保留时间

    PASSWORD_VERIFY_FUNCTION:    口令复杂度审计函数

     

    PASSWORD_LIFE_TIME:口令有效时间

    口令使用期限(按照国网要求,三个月修改一次密码,即90天)。

    PASSWORD_GRACE_TIME:

    指的是在你的密码已经过期以后, 第一次登录时间开始往后统计,使系统可以使用的日期限度。

    PASSWORD_REUSE_TIME

    是重用密码的最小时间间隔,单位是天。可以给出整数或分数,如1/1440表示1分钟(出于效率的考虑,oracle不会每分钟都去进行检查,一般来说,有5分钟左右的误差,因此如果这个数小于1/144则没有多大的意义)。

     

    PASSWORD_REUSE_MAX  是重用密码前更换密码的最小次数。

     

    安全设置:

    根据公司密码策略修改$ORACLE_HOME /rdbms/admin/utlpwdmg.sql文件的192-197行:如下:

     

    生效方法:

       $cd $ORACLE_HOME /rdbms/admin/

    $sqlplus /nolog

    >conn /assysdba;

    >@utlpwdmg.sql

    >quit

    设置后,密码复杂度必须包含字母,数字,标点(不区分大小写),最小长度为8

    1.2 数据库访问控制加固

    1.2.1 限制数据库文件的访问权限

           A.用操作系统命令查看库文件访问权限

     

    #ls –l $ORACLE_BASE/oradata

     

           B.用操作系统命令删除库文件组和其他用户的写权限

     

    #chmod 640 $ORACLE_BASE/oradata/*

     

    1.2.2 设置ORALCE可执行程序文件的最小访问权限

           A.用操作系统命令查看$ORALCE_HOME/bin下可执行程序的访问权限

     

    #ls –l $ORACLE_HOME/bin

     

           B.用操作系统命令删除库文件组和其他用户的写权限

     

    #chmod 640 $ORACLE_HOME/bin/*

    1.3 服务加固

    1.3.1 清理数据库中无用的表,视图

           A.查看数据库中表或视图等对象

    SQL>SELECT  *  FROMDBA_TABLES;

    SQL>SELECT  *  FROMDBA_VIEWS;

           B.删除数据库中存在的无用的,测试的表或视图

    SQL>DROP TABLE <TABLENAME>;

    SQL>DROP VIEW <VIEWNAME>;

     

    1.4 网络访问控制加固

    1.4.1 设置TNS登录IP限制

           A.在目录$ORACLE_HOME/network/admin下修改sqlnet.ora 文件实现TNS登录IP限制,设置信息如下:

           tcp.validnode_checking=yes

           #允许访问的IP

           tcp.invited_nodes=(ip1,ip2,…)

    #不允许访问的IP

    tcp.execluded_node=(ip1,ip2,…)

    B.修改sqlnet.ora后,重新启动listener服务。

     

    需要注意的问题:

    1需要设置参数为YES,这样才能激活。

    2建议设置允许访问的IP,因为IP地址有可能被随意修改,就不能起到自己的目的。

    3 TCP当参数TCP.INVITED_NODESTCP.EXCLUDED_NODES设置的地址相同的时候将覆盖TCP.EXCLUDED_NODES设置。

    4需要重启监听器才能生效。

    5这个方式只是适合TCP协议。

    6这个配置适用于9i以上版本。在9i之前的版本使用文件protocol.ora

    7在服务器上直接连接数据库不受影响。

    8这种限制方式事通过监听器来限制的。

    9这个限制只是针对IP检测,对于用户名检测事不支持的。

    1.4.2 修改数据库默认端口

    A. 停止监听

    su – oracle

    $lsntctl stop

    B. 修改监听文件的端口号,在目录$ORACLE_HOME/network/admin下修改listener.ora文件

    LISTENER =

     

    (DESCRIPTION_LIST =

     

     (DESCRIPTION = 

     

     (ADDRESS = (PROTOCOL = TCP)(HOST=LOCALHOST)(PORT=11251))

     

     )

     

    )

     

    C. 修改初始化参数local_listener

    SQL> ALTER SYSTEM SETlocal_listener=’’(address=(protocol=tcp)(host=localhost)(port=11521))”;

    SQL> quit

    D. 重启监听

    $lsnrctl start

    E. 修改完毕,使用新端口登录测试

    netstat –tunap|grep grep 11521

    lsnrctl status

    客户端连接测试。

    1.4.3 关闭操作系统远程认证

    操作系统认证方式登录数据库的含义是:只要是以oracle用户登录的用户都可以使用"sqlplus/ as sysdba"方式连接到数据库中。

        出于安全的考虑,我们可能需要禁用这个特性。当然,如果以操作系统认证方式无法顺利登录,也可以通过在这个方法来排查故障问题。

        1.以操作系统认证方式登录数据库的方法

        1)最基本的方法就是使用"sqlplus/ as sysdba"登录数据库

        [oracle@secdb admin]$ sqlplus / as sysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:00:10 2010

        Copyright c1982, 2006, Oracle.  All Rights Reserved.

        Connected to:

        Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production

        With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options

        SQL>

        斜杠"/"左面是用户名,右面是密码,这里表示不给出用户名和密码一样可以登录到数据库系统中。

        2)使用正确的用户名和密码登陆数据库

        [oracle@secdb admin]$ sqlplus sys/oracle assysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:00:52 2010

        Copyright c1982, 2006, Oracle.  All Rights Reserved.

        Connected to:

        Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production

        With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options

        SQL>

        显然,登录完全没有问题。

        3)使用错误的用户名和密码登陆数据库

        [oracle@secdb admin]$ sqlplussys_1/oracle_1 as sysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:01:07 2010

        Copyright c1982, 2006, Oracle.  All Rights Reserved.

        Connected to:

        Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production

        With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options

        SQL>

        这种操作系统认证方式登录数据库,即使使用的是错误的用户名和密码依然可以顺利的登录到数据库中。

        2.禁用操作系统认证方式登录数据库

        禁用的方法很简单,仅需在sqlnet.ora配置文件中添加一条"SQLNET.AUTHENTICATION_SERVICES=NONE"即可。

        调整sqlnet.ora文件内容。

        [oracle@secdb ~]$ vi$ORACLE_HOME/network/admin/sqlnet.ora

        SQLNET.AUTHENTICATION_SERVICES=NONE

    3.验证是否生效

        1)必须使用正确的用户名和密码才能登陆到系统中

        [oracle@secdb admin]$ sqlplus sys/oracle assysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:58:29 2010

        Copyright c1982, 2006, Oracle.  All Rights Reserved.

        Connected to:

        Oracle Database 10g Enterprise EditionRelease 10.2.0.3.0 - 64bit Production

        With the Partitioning, Oracle LabelSecurity, OLAP and Data Mining Scoring Engine options

        SQL>

        2)使用正确的用户名和错误的密码进行登录测试

        [oracle@secdb admin]$ sqlplus sys/oracle_1as sysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:59:14 2010

        Copyright c 1982, 2006, Oracle.  AllRights Reserved.

        ERROR:

        ORA-01017: invalid username/password; logondenied

        Enter user-name:

        提示无效的用户名和密码,无法完成登录!

        3)使用"sqlplus /as sysdba"登录方式进行验证

        [oracle@secdb admin]$ sqlplus / as sysdba

        SQL*Plus: Release 10.2.0.3.0 - Productionon Sun Dec 26 21:58:05 2010

        Copyright c1982, 2006, Oracle.  All Rights Reserved.

        ERROR:

        ORA-01031: insufficient privileges

        Enter user-name:

        此处显示权限不足,不允许登录!

        4.进一步提高系统的安全性

        因为sqlnet.ora文件默认条件下oracle用户可以对其进行任意修改,我们可以通过调整sqlnet.ora文件的owner和权限的方式进一步提高系统的安全性。

        1)默认条件下sqlnet.ora文件的权限和owner信息

        [oracle@secdb admin]$ ls -l sqlnet.ora

        -rw-r--r-- 1 oracle oinstall 266 Dec 2621:00 sqlnet.ora

        2)调整sqlnet.ora文件的owner和权限信息

        [root@secdb admin]# chown root:rootsqlnet.ora

        [root@secdb admin]# chmod 744 sqlnet.ora

        [root@secdb admin]# ls -l sqlnet.ora

        -rwxr--r-- 1 root root 266 Dec 26 21:00sqlnet.ora

        调整之后,oracle用户将再无权限对sqlnet.ora文件进行调整。

       

        操作系统认证方式连接数据库是默认行为,这种方法给我们管理数据库带来了极大的便利。在得到便捷操作的同时带来的是安全上的问题,权衡利弊,做出最后的选择。

    1.6 审计策略加固

           启用相应的审计功能,配置审核策略使系统能够审核数据库管理和安全相关操作的信息,建议对SYSDBA审计操作

           A.启用审计功能

    SQL>ALTER SYSTEM SET audit_trail=osscope=spfile;

           B.启用对SYSDBA的活动审计

    SQL>ALTER SYSTEM SETaudit_sys_operations=true;

           C.重启数据库生效

     

     对于Oracle数据库的审计,我们一般都会认为一般不能开审计啊,一旦开启了会对oracle数据库的性能产生巨大影响。所以针对oracle自身的数据库审计的策略几乎很少有人提起。今天我就测试一下细致化的审计策略是否对数据库的操作审计有效。

    首先我们先看一下Oracle默认安装后审计策略设置是怎样的。

     1

     

    1.7 由图可知默认情况下,审计策略是关闭的,而且审计记录存储的模式也未选择。所以默认情况下,某用户对某表做了某操作都是不做任何记录的。

        这里先补充说明一下audit_sys_operations 值只有TRUEFALSE两个之分。

    但是audit_trail值有如下情况:

    1audit_trail=DB表示把审计日志记录到数据库sys.audit$表中。

    2audit_trail=DBextendedDB选项基础上,audit$表中还增加了SQLBINDSQLTEXT两个clob栏位,用来存储SQLBINDSQLTEXT信息。

    3 audit_trail=OS审计结果存放在操作系统的审计信息中,若是windows 平台,audit trail会记录在windows的事件管理器中,若是linux/unix平台则会记录在audit_file_dest参数指定文件中。

    4audit_trail=xml’审计结果存放在XML, 并包含XML文件可以由数据库以外的工具方便地处理,过滤出有用的事件,与其它系统中的审计日志组合,并格式化HTML显示,操作系统文件提供比SYS.AUD$表更强大的安全性,特别是在希望阻止数据库管理员查看或修改审计跟踪的情况下,即使关闭数据库实例,仍然可以继续使用保存在数据库外的审计日志。用以下代码确定写入审计文件的目录: audit_file_dest='directorypath' 。注意,directorypath这不是一个目录对象,而是操作系统目录的实际路径名。

    5 audit_trail=xmlextended,存储为xml,并包含SQLBINDSQLTEXT信息。

    audit_trailstatic参数,每次修改后需要重新启动数据库才能生效。

     

    此实验我们设置audit_trail值为DB,把审计日志记录到数据库sys.audit$表中。

     

    SQL > alter systemset audit_sys_operations=TRUE scope=spfile ;

    SQL > alter systemset audit_trail=DB scope=spfile ;

    然后重启数据库: startup force




    Mysql部分

    操作系统级别的加固

    2.1.1 将数据库文件放在系统分区以外的分区

    root 登录

    show variableswhere variable_name = 'datadir';

     

    修改my.cnf,增加或修改如下信息:

    [mysqld]

    #mysql数据文件实际存放路径

    datadir=/wwwroot/mysql

     

    设置完后,重启mysql

    2.1.2 使用最小权限允许Mysql数据库进程

    #useradd mysql

    #passwd mysql

    #chown –R mysql:mysqlmysql文件目录

     

    建议:该项在mysql 安装时实现。

    2.1.4 禁用mysql命令历史记录

    #find / -name“.mysql_history”

    删除.mysql_history文件

    设置环境变量MYSQL_HISTFILE/dev/null,并添加到初始化脚本中,创建mysql_history/dev/null的软连接

    #ln –s /dev/null.mysql_history //mysql记录文件置空

    #ln -s /dev/null.bash_history //shell记录文件置空

    2.1.5 确保MYSQL_PWD环境变量未设置敏感信息

    #grep MYSQL_PWD /proc/*/environ

     

    如果查询到,需进行脱敏处理。

    2.2 安装时加固

    l   使用专用的服务器作为MYSQL数据库服务器。

    l   根据不同业务分配专用的登录账号。

    l   禁止在系统命令行使用明文登录MYSQL数据库。

    l   执行mysql_secure_installation 程序

    数据库初次安装完成后,找到mysql_secure_installation程序,并执行他,按提示完成安全设置。

    find / -name'mysql_secure_installation'

    2.3 文件权限加固

    2.3.1 控制数据目录的访问权限

    root 登录

    show variableswhere variable_name = 'datadir';

     

           在终端命令行执行如下命令:

    #ls -l <datadir>/.. | egrep"^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"

           其中<datadir>是第一条命令的执行结果;

           如果存在问题,linux环境下在终端执行如下命令进行加固:

     

    chmod 700<datadir>

    chownmysql:mysql <datadir>

    2.3.2 控制二进制日志的使用权限

           Mysql命令行下执行如下命令:

     

    >show variables like 'log_bin_basename';

     

    在终端命令行执行如下命令:

    #ls <log_bin_basename>.*

    对于发现的每一个文件,执行如下命令:

    #ls -l <log_bin_basename.nnnnn> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"

     

    根据输出确认日志文件的权限设置是否存在问题。

     

    对于每个日志文件,修改其权限和属组如下:

     

    chmod 660 <log file>

    chown mysql:mysql <log file>

    2.3.3 控制错误日志文件的权限

    Mysql命令行下执行如下命令:

     

    >show variables like 'log_error';

     

    在终端命令行执行如下命令:

    #ls <log_error>.*

    对于发现的每一个文件,执行如下命令:

    #ls -l <log_error> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"

     

    根据输出确认日志文件的权限设置是否存在问题。

    对于每个日志文件,修改其权限和属组如下:

    #chmod 660 <log file>

    #chown mysql:mysql <log file>

    2.3.4 控制慢查询日志文件的权限

           Mysql命令行下执行如下命令:

     

    >show variables like 'log_error';

     

    在终端命令行执行如下命令:

    #ls <log_error>.*

    对于发现的每一个文件,执行如下命令:

    #ls -l <log_error> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"

     

    根据输出确认日志文件的权限设置是否存在问题。

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <log file>

    chown mysql:mysql <log file>

    2.3.5 控制通用日志文件的权限

           Mysql命令行下执行如下命令:

     

    >show variables like 'general_log_file';

     

    在终端命令行执行如下命令:

    #ls <general_log_file>.*

    对于发现的每一个文件,执行如下命令:

    #ls -l <general_log_file> | egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"

    根据输出确认日志文件的权限设置是否存在问题。

    对于每个日志文件,修改其权限和属组如下:

    #chmod 660 <log file>

    #chown mysql:mysql <log file>

    2.3.6控制审计日志文件的权限

    Mysql命令行下执行如下命令:

     

    >show global variables where variable_name=  'audit_log_file';

     

    在终端执行如下命令:

    #ls -l <audit_log_file> | egrep"^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[

    \t]*mysql.*$"

     

    根据输出确认日志文件的权限设置是否存在问题。

    对于每个日志文件,修改其权限和属组如下:

    #chmod 660 <audit_log_file>

    #chown mysql:mysql <audit_log_file>

     

    2.4通用安全加固

    2.4.1 删除test数据库

           Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:

     

    Drop database “test”

    2.4.2 确保读取本地文件的参数设置失效

           Mysql命令行下,使用如下命令:

     

    >SHOW VARIABLES WHERE Variable_name ='local_infile';

     

    查看结果是否为OFF

    如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:

    Local-infile=0

    然后重启数据库服务。

    2.5数据库权限加固

    2.5.1 控制可以访问所有数据库的账号权限

    Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。

     

    使用如下sql语句:

     

    SELECT user, host FROM mysql.user

    WHERE (Select_priv = 'Y') OR(Insert_priv = 'Y') OR (Update_priv = 'Y')

    OR (Delete_priv = 'Y')  OR (Create_priv = 'Y')  OR (Drop_priv = 'Y');

    SELECT user, host FROM mysql.db WHERE db ='mysql'

    AND ((Select_priv = 'Y') OR(Insert_priv = 'Y') OR (Update_priv = 'Y')

    OR (Delete_priv = 'Y') OR(Create_priv = 'Y') OR (Drop_priv = 'Y'));

     

    确保返回结果只能是数据库管理员账号。

    2.5.2 限制非管理员用户的权限

    Mysql.user表中的权限列有:

    file_priv:表示是否允许用户读取数据库所在主机的本地文件;

    Process:表示是否允许用户查询所有用户的命令执行信息;

    Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;

    Shutdown_priv:表示用户是否可以关闭数据库;

    Create_user_priv:表示用户是否可以创建或删除其他用户;

    Grant_priv:表示用户是否可以修改其他用户的权限;

    应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:

    select user, host from mysql.user whereFile_priv = 'Y';

    select user, host from mysql.user whereProcess_priv = 'Y';

    select user, host from mysql.user whereProcess_priv = 'Y';

    SELECT user, host FROM mysql.user WHEREShutdown_priv = 'Y';

    SELECT user, host FROM mysql.user WHERECreate_user_priv = 'Y';

    SELECT user, host FROM mysql.user WHEREGrant_priv = 'Y';

    SELECT user, host FROM mysql.db WHEREGrant_priv = 'Y';

    确保查询结果中不存在非管理员用户。

    如果存在非管理员用户,使用如下命令进行权限回收:

    REVOKE FILE ON *.* FROM '<user>';

    REVOKE PROCESS ON *.* FROM '<user>';

    REVOKE SUPER ON *.* FROM '<user>';

    REVOKE SHUTDOWN ON *.* FROM '<user>';

    REVOKE CREATE USER ON *.* FROM '<user>';

    REVOKE GRANT OPTION ON *.* FROM <user>;

    其中user为上述查询到的非管理员用户。

    2.5.3 合理控制DML/DDL操作授权

    DML/DDL语句包括创建或修改数据库结构的权限,例如insertupdatedeletecreatedropalter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:

     

    SELECT User,Host,Db FROM mysql.db WHERESelect_priv='Y'

    OR Insert_priv='Y' ORUpdate_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'

    OR Drop_priv='Y' OR Alter_priv='Y';

     

    上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:

     

    REVOKE SELECT ON <host>.<database>FROM <user>;

    REVOKE INSERT ON <host>.<database>FROM <user>;

    REVOKE UPDATE ON <host>.<database>FROM <user>;

    REVOKE DELETE ON <host>.<database>FROM <user>;

    REVOKE CREATE ON <host>.<database>FROM <user>;

    REVOKE DROP ON <host>.<database>FROM <user>;

    REVOKE ALTER ON <host>.<database>FROM <user>;

     

    其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。

    2.6加固审计和日志

    2.6.1 开启错误日志审计功能

    错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:

     

    >SHOW variables LIKE 'log_error';

     

    确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。

    2.6.2 确保日志存放在非系统区域

    日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:

     

    >SELECT @@global.log_bin_basename;

     

    确保返回结果不是如下路径://var/usr.

    2.6.3 关闭原始日志功能

    原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:

     

    Log-raw = OFF

    2.7认证加固

    2.7.1 Old_password环境变量设置

    Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY CREATE USER GRANT 等语句是时的hash算法:

     

    0 - authenticate with the mysql_native_passwordplugin

    1 - authenticate with the mysql_old_passwordplugin

    2 - authenticate with the sha256_passwordplugin

     

    设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:

     

    >SHOW VARIABLES WHERE Variable_name ='old_passwords';

     

    确保返回值不为1

    参考文档:https://dev.mysql.com/doc/refman/5.6/en/account-upgrades.html

    2.7.2 密码保存

           严禁将密码保存在全局配置文件中。

    2.7.3 禁止所有用户使用非空密码登录

    执行如下语句查询是否有用户不需要密码即可登录:

     

    SELECT User,host

    FROM mysql.user

    WHERE (plugin IN('mysql_native_password','mysql_old_password')

    AND (LENGTH(Password) = 0

    OR Password IS NULL))

    OR (plugin='sha256_password' ANDLENGTH(authentication_string) = 0);

     

     

    版本不一样用如下命令:

    mysql> selecthost,user,authentication_string from mysql.user;

    +-----------+-----------+-------------------------------------------+

    | host      | user      | authentication_string                     |

    +-----------+-----------+-------------------------------------------+

    | localhost |root      |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

    | localhost |mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |

    | %         | root      |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

    +-----------+-----------+-------------------------------------------+

    3 rows in set (0.00sec)

     

    mysql>

     

     

     

    2.7.4删除空账号

           DELETE FROM mysql.user WHERE user = '';



    展开全文
  • 15、数据库加固

    2022-06-01 08:39:10
    数据库加固

    MySQL

    修改root密码

    在这里插入图片描述

    删除无用的数据库,无用帐号,密码为空的帐号

    在这里插入图片描述
    别删root用户,修改密码即可。
    操作完一定要刷新。

    更新管理员用户名,防止暴力破解

    在这里插入图片描述

    添加用户,密码进行加密处理

    在这里插入图片描述
    上面是老版本的,新版本的字段会更多,推荐使用create user方法

    更改mysql启动用户

    在这里插入图片描述

    限制远程连接数

    在这里插入图片描述
    给帐户设置最大连接数

    关闭远程管理数据库(小心,沟通好是否需要远程)

    在这里插入图片描述

    清理MySQL命令历史

    在这里插入图片描述

    禁止MySQL读取本地文件

    在这里插入图片描述

    禁止将表导出到文件

    在这里插入图片描述
    具体要看业务

    备份数据库

    在这里插入图片描述

    Redis

    禁止网络访问Redis

    在这里插入图片描述
    ::1 是ipv6
    根据业务

    设置iptables防火墙过滤流量

    在这里插入图片描述
    不能设置本地回环时,使用防火墙来限制。允许哪些外网IP访问。

    禁用高危命令

    在这里插入图片描述
    flushall清空所有
    flushdb清空数据库
    shutdown关闭数据库
    rename-command 起别名 ""就不生效

    开启Redis密码

    在这里插入图片描述

    创建普通帐号运行redis

    在这里插入图片描述

    备份和恢复数据库

    在这里插入图片描述

    MongoDB

    创建配置文件

    在这里插入图片描述

    修改端口号

    在这里插入图片描述
    默认端口28017

    在配置文件中添加IP信息

    在这里插入图片描述
    bind_ip只能用这个IP来访问MongoDB

    开启认证功能

    在这里插入图片描述

    展开全文
  • 数据库安全加固

    2021-10-13 19:59:17
    数据库安全威胁 业务系统 系统漏洞 DDOS 攻击 SQL注入(高发) 自定义、自封装接口漏洞 滥用合法权限或者合法权限泄漏 业务系统攻击间接传导 业务日志泄露 请求分配不均(主要影响应用性能) 数据库自身 系统漏洞 ...
  • MYSQL数据库加固

    2020-06-07 13:42:34
    收集整理比较全面的MYSQL数据库加固 MYSQL数据库加固指导手册 1. 数据库存放位置检查 windows系统: 数据库不可以放在C盘 linux系统:数据库文件不可以存放在 /,/var,/usr目录内 #连上mysql数据,mysql -uroot -p...
  • 数据库加固规范

    2014-05-22 14:49:46
    Oracle数据库系统加固规范 真不错的。拿来给大家分享一下
  • SqlServer数据库系统加固规范
  • 根据等保2.0基本要求整理的针对服务器、数据库、应用系统、网络安全设备加固建议
  • 首先要声明的是本文只针对人员和资源有限的小型公司或组织而言,只是探讨一些能够在有限的资源内实现的数据库加固手段。相信删库跑路是任何组织或老板都害怕的事,要是管理不规范,开发人员的删库跑路可能直接把公司...
  • MySQL数据库安全加固

    2022-07-14 16:05:26
    1、了解MySQL数据库几种常见威胁 2、掌握几种常见的安全加固方式mysql-5.5.56-winx64软件 Windows10虚拟机 Windowsxp虚拟机 kali虚拟机内容1步骤及结果:实验环境配置 (1)安装mysql5.5.56-winx64 双击mysql5.5.56-...
  • 前言最近打算整理一下资料,写几篇关于数据库安全的文章。特此记录,方便查阅。账号加固以普通帐户安全运行mysqld,禁止mysql以root帐号权限运行。防止攻击者可能通过mysql进行提权。配置/etc/my.cnf[mysql.server]...
  • 要注意以下方面1. 修改sys, system的口令。2. Lock,修改,删除默认用户: dbsnmp,ctxsys等。...4. 把O7_DICTIONARY_ACCESSIBILITY改成False。...6. 检查数据库的数据文件的安全性。不要设置成666之类的。检查其他db...
  • Mssql数据库系统安全加固规范,针对mssql数据库的安全
  • 数据库安全配置中,需要做相关的安全加固工作。以确认数据库的安全,但是,有些时候,操作不当或者数据库业务账号修改密码后,而程序的连接数据库的配置封装在jar里,如果jar内的连接数据库的配置信息没有做相应的...
  • Cassandra数据库加固

    2020-04-23 21:45:12
    Cassandra数据库加固规则 1. 数据库版本选择上的安全加固 进行Cassandra数据库版本选择的时候,尽量选择稳定性、安全性较高的版本,也就是平常所说的优选版本。 进行Cassandra数据库版本升级时,综合考虑新版本有...
  • Oracle数据库脆弱性加固,经过多个项目的实践,适合项目开局及日常维护。
  • Oracle数据库系统安全加固规范,增加数据库安全性。
  • DB2数据库系统加固规范

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,630
精华内容 5,052
关键字:

数据库加固

友情链接: code.zip