数据库系统安全构建


1.Linux系统安全构建

1.1 Linux系统安全方面需要注意的地方

 

    账户安全方面,设置复杂的密码,定期更改密码。权限的控制。

 

    网络服务方面,关闭不必要的服务,更改服务默认端口。

 

###关注系统重要日志,是否有异常登录

# tail /var/log/messages

# tail /var/log/maillog

# tail /var/log/secure

# tail /var/mail/root

 

    另外需要时时关注文件:

# cat /etc/passwd                              ####查看是否新增用户,用户sid是否异常,用户属组是否异常

# cat /etc/shadow      ####查看登录用户是否有设置密码

 

####如果有异常用户,及时锁定用户

1> /etc/passwd文件中该用户对应的shell域设置为 /bin/false 使其用户无法登录系统。

2> 使用明了锁定用户 passwd -l username        解锁:passwd -d username 解锁后,用户没有密码,要及时设定密码

 

对于passwdshadow有没有更好的保护方法呢?

如果系统暂时不会添加新的用户,并且不会改用户密码时,可以将这两个文件锁住。

示列:

[root@zyx test]# echo "testdel" >>test.txt

[root@zyx test]# ll

total 4

-rw-r--r-- 1 root root 8 Apr 23 19:34 test.txt

[root@zyx test]# lsattr test.txt

-------------e- test.txt

[root@zyx test]# chattr +i test.txt

[root@zyx test]# lsattr

----i--------e- ./test.txt

[root@zyx test]# ll

total 4

-rw-r--r-- 1 root root 8 Apr 23 19:34 test.txt

[root@zyx test]# echo "add test" >>test.txt

-bash: test.txt: Permission denied

[root@zyx test]# del test.txt

-bash: del: command not found

[root@zyx test]# rm -rf test.txt

rm: cannot remove `test.txt': Operation not permitted

[root@zyx test]# chattr -i test.txt

[root@zyx test]# echo "add test" >>test.txt

[root@zyx test]# cat test.txt

testdel

add test

###### chattr +i 参数设定的文件不能被删除、改名、设定链接、新增内容,将该文件锁定。使用lsattr可以查看属性

 

  其他系统配置:

1.2 是否关闭PING

频繁地使用Ping命令会导致网络堵塞、降低传输效率,甚至可能会被黑客检测端口然后进行DDOS攻击。

 

linux下关闭ping(当然启用防火墙也可以实现):

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

 

linux下开启ping

# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

 

1.3 禁止IP源路径路由

允许IP源路径路由(IP source routing)会使得黑客能够欺骗你的计算机,截取信息包。

 

批量修改:

for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $i done

 

现在的linux系统中都已经默认禁止了IP源路径路由,所以只需要检查一下即可。

 

1.4 TCP SYN Cookie保护,防止SYN Flood攻击

SYN Flood是当前最流行的DoS(拒绝服务攻击)DDoS(分布式拒绝服务攻击)的方式之一,它是利用TCP(三次握手)协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式,最终导致系统或服务器宕机

 

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 

现在的linux系统中都已经默认进行了保护,只需检查一下即可。

 

1.5 防火墙iptables配置

 

#1> 启用防火墙

/etc/rc.d/init.d/iptables start 

/etc/rc.d/init.d/ip6tables start  

chkconfig --list iptables

chkconfig --level 35 iptables on

chkconfig --level 35 ip6tables on

 

#2> 查看本机iptables设置情况

iptables -L -n

 

#3> 清除linux所有规则

# iptables -F       ###清除预设filter中的所有规则链的规则

# iptables -X       ###清除预设表filter中使用者自定链中的规则

 

######清除规则后,相当于没有启动防火墙!!!!!!!!!

 

#4> 添加规则注意事项

两种方式:

第一种是编辑 /etc/sysconfig/iptables 添加规则后,service iptables restart 即可保存配置。

第二种方式是直接输入命令添加,添加完成后执行 /etc/sysconfig/iptables save  保存配置规则。

 

iptables -h

                -A:指定链名   

                -p:指定协议类型   

                -d:指定目标地址   

                --dport:指定目标端口(destination port 目的端口)   

                --sport:指定源端口(source port 源端口)   

                -j:指定动作类型  

 

#5> 配置SSH允许连接

# INPUT 处理来自外部的数据

# OUTPUT 处理向外发送的数据

# FORWARD 将数据转发到本机的其他网卡设备上

 

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

/etc/init.d/iptables save

cat /etc/sysconfig/iptables

service iptables restart

 

###将不符合iptables配置规则ACCEPT的连接全部DROP掉,比如现在,没有开放ftp,那么ftp将不能再建立连接咯

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD DROP

/etc/init.d/iptables save

 

#6> /etc/sysconfig/iptables文件配置

*filter   

:INPUT DROP [0:0]

:FORWARD DROP [0:0]

:OUTPUT DROP [0:0]

#下面规则担负大部分工作

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   

#ping及本机访问

-A INPUT -p icmp -j ACCEPT    # INPUT 设置为drop就需要添加

-A OUTPUT -p icmp -j ACCEPT    #OUTPUT 设置为drop 就需要添加

 

#允许本地回环接口(即本机访问本机)

-A INPUT -i lo -j ACCEPT   

-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT   

-A INPUT -s 192.168.11.111/32 -d 192.168.11.111/32 -j ACCEPT   

-A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT   

-A OUTPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT   

 

#允许SSH

-A INPUT -p tcp --dport 22 -j ACCEPT

-A OUTPUT -p tcp  --sport 22 -j ACCEPT

COMMIT   

# Completed on Sat Apr 23 01:47:20 2016

 

#7> iptables配置脚本

####本脚本中只对访问该服务器作限制,服务器访问其他设备不做限制

 

[root@zyx ~]# vim iptable.sh

#!/bin/bash

#creator:shall

#create time:2016-7-12

#usage:this is a firewall config

 

#启动防火墙

service iptables start

service ip6tables start

chkconfig --level 35 iptables on

chkconfig --level 35 ip6tables on

 

#清除已有iptables规则

iptables -F

iptables -X

#iptables -L -n

 

#添加ssh访问

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT   ## OUTPUTDROP时添加

/etc/init.d/iptables save

 

#将不符合iptables配置规则ACCEPT的连接全部DROP

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

 

#允许本地回环接口

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

# iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT   ## OUTPUTDROP时添加

 

 

#如果服务器有WEB

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT

 

#如果服务器有FTP

# iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# iptables -A INPUT -p tcp --dport 20 -j ACCEPT

 

#如果服务器有oracle数据库

iptables -A INPUT -p tcp --dport 1521 -j ACCEPT

 

#允许icmp包通过

iptables -A INPUT -p icmp -j ACCEPT

#iptables -A OUTPUT -p icmp -j ACCEPT

 

#允许loopback(不然可能会导致DNS无法正常关闭)

iptables -A INPUT -i lo -p all -j ACCEPT

# iptables -A OUTPUT -o lo -p all -j ACCEPT

 

#DNS

iptables -A INPUT -p udp --dport 53 -j ACCEPT

# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT

 

#允许所有已经建立连接的和相关的连接

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

 

#禁止某ip访问

#iptables -I INPUT -s 192.168.11.12 -j DROP

#iptables -I INPUT -s 192.168.0.0/16 -j DROP

 

#save

/etc/init.d/iptables save

service iptables restart

iptables -L -n

 

 

2.Oracle自身安全构建

2.1 listener.ora修改默认监听端口及关闭Extproc功能

    oracle的监听端口默认为1521,可以修改为其他端口,修改后需重启监听才能生效。

[oracle@zyx ~]$ lsnrctl stop

[oracle@zyx ~]$ emctl stop dbconsole

[oracle@zyx ~]$vim $ORACLE_HOME/network/admin/listener.ora

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

#      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = zyx.test.com)(PORT = 22221))

    )

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

[oracle@zyx ~]$ lsnrctl start

[oracle@zyx ~]$ netstat -tln|grep 22221

 

###写入监听别名(或者直接使用之前的tns,将端口修改即可)

[oracle@zyx ~]$vim $ORACLE_HOME/network/admin/tnsnames.ora

listener22221 =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = zyx.test.com)(PORT = 22221))

   )

 

sys@ORCL>alter system set local_listener='listener22221';

sys@ORCL>alter system register;

[oracle@zyx ~]$ lsnrctl status

[oracle@zyx ~]$ sqlplus sys/sys@192.168.5.231:22221/orcl.test.com as sysdba

 

2.2 tnsnames.ora关闭Extproc功能

    修改目录$ORACLE_HOME/network/admin/下的TNSNAMES.ORALISTENER.ORA文件,删除或注释以下条目:

                   icache_extproc

                   PLSExtproc

                   Extproc

[oracle@zyx ~]$vim $ORACLE_HOME/network/admin/tnsnames.ora

#EXTPROC_CONNECTION_DATA =

#  (DESCRIPTION =

#    (ADDRESS_LIST =

#      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

#    )

#    (CONNECT_DATA =

#      (SID = PLSExtProc)

#      (PRESENTATION = RO)

#    )

#  )

 

2.3 sqlnet.ora限制ip登录数据库

    修改sqlnet.ora后,需要重启listener服务才能生效

$ORACLE_HOME/network/admin/中配置sqlnet.ora

tcp.validnode_checking=yes          -------打开ip检查

tcp.invited_nodes=(IP1,IP2,IP3)

tcp.excluded_nodes=(IP4,IP5,IP6)

 

其中invited_nodes为仅允许IP1,IP2,IP3访问(设置该参数后,注意添加数据库本机IP

excluded_nodes为禁止IP4,IP5,IP6访问

 

当仅存在excluded_nodes,仅禁止456

当存在invited_nodes,excluded_nodes条目无效,除了invited_nodes列出的IP,其他IP地址均不能访问

 

该方法无法进行IP地址段的访问控制

 

##另外在sqlnet.ora中也可以添加SQLNET.EXPIRE_TIME=10 表示客户端连接后超过10分钟无任何操作就备自动断开。设置该参数同时也可以防止客户端异常断开连接后,占有的相应进程没有被释放,从v$session还能看到session处于inactive,对应服务进程也没有,释放导致资源长时间占用。(清理有PMON进行)

 

#开始配置

[oracle@zyx ~]$ lsnrctl stop

[oracle@zyx ~]$ vim $ORACLE_HOME/network/admin/sqlnet.ora

#解析顺序tnsEasy Connect Naming MethodTNSNAMES,HOSTNAME, ONAMES, EZCONNECT

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /u01/app/oracle

 

#打开ip检查

tcp.validnode_checking=yes

 

#允许的ip访问  一定要添加本机IP 否则无法注册监听

#如果不添加本地ip,那么需要在hosts中添加 127.0.0.1  zyx.test.com

tcp.invited_nodes=(zyx.test.com,192.168.5.209)

 

#禁止的ip访问

#tcp.excluded_nodes=(IP4,IP5,IP6)

 

[oracle@zyx ~]$ lsnrctl start

sys@ORCL>alter system register;

[oracle@zyx ~]$ lsnrctl status

 

######拒绝登录的报错为 ORA-12537:TNS:连接关闭 或ORA-12547:TNS:丢失连接(之前可以连接刚配置生效后就不能连接咯)

 

2.4 限制sysdba远程登录/本地身份认证登录

#根据需要修改,有时修改后,不方便管理

 

1> 限制sysdba远程登录

sys@ORCL>show parameter remote_login_passwordfile

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

remote_login_passwordfile            string      EXCLUSIVE

 

sys@ORCL>alter system set remote_login_passwordfile='NONE' scope=spfile;

 

###修改之后需要重新启动数据库,此时,用sysdba远程连接数据库会报错

C:\Users\ya_xuan>sqlplus sys/sys@192.168.5.231:22221/orcl.test.com as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 7 12 16:44:59 2016

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:

ORA-01017: invalid username/password; logon denied

请输入用户名:

 

2> 限制sysdba本地身份认证登录

sqlnet.ora中设置SQLNET.AUTHENTICATION_SERVICES=NONE 来禁用sysdba角色本地认证登录  NONE表示oracle数据库身份认证  NTS表示操作系统身份认证)

 

###修改后,本地身份认证将不能在登录

[oracle@zyx ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Sat Apr 23 04:32:02 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

ERROR:

ORA-01017: invalid username/password; logon denied

Enter user-name:

 

 

sqlnet.ora文件中

SQLNET.AUTHENTICATION_SERVICES= (NTS)     基于操作系统验证;

SQLNET.AUTHENTICATION_SERVICES= (NONE)  基于Oracle密码文件验证

SQLNET.AUTHENTICATION_SERVICES= (NONE,NTS)  二者并存

 

2.5 profile用户密码策略、资源限制设置

 

2.5.1 查看该用户分配的profile

select profile from dba_users where username='SHALL';

 

##查看当前有哪些profile,及profile设定参数

select distinct profile from dba_profiles;

select * from dba_profiles where profile='DEFAULT';

 

 

2.5.2 启用资源限制及密码策略

sys@ORCL>show parameter resource_limit

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

resource_limit                       boolean     FALSE

 

alter system set resource_limit=true;

 

##

    Oracle本身提供一个密码复杂性函数脚本,可以根据需要修改或者直接执行Oracle提供的验证函数脚本$ORACLE_HOME/rdbms/admin/utlpwdmg.sql,执行该脚本后,会生成一个密码复杂性函数,并且会更改defaultprofile参数设定,一般我们保留default的默认设定,重新创建一个新到profile。因此需要修改一下脚本内容

 

[oracle@zyx ~]$ vim $ORACLE_HOME/rdbms/admin/utlpwdmg.sql

CREATE OR REPLACE FUNCTION verify_function_11G

(username varchar2,

  password varchar2,

  old_password varchar2)

  RETURN boolean IS

   n boolean;

   m integer;

   differ integer;

   isdigit boolean;

   ischar  boolean;

   ispunct boolean;

   db_name varchar2(40);

   digitarray varchar2(20);

   punctarray varchar2(25);

   chararray varchar2(52);

   i_char varchar2(10);

   simple_password varchar2(10);

   reverse_user varchar2(32);

 

BEGIN

   digitarray:= '0123456789';

   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

 

   -- Check for the minimum length of the password

   IF length(password) < 8 THEN

      raise_application_error(-20001, 'Password length less than 8');

   END IF;

 

 

   -- Check if the password is same as the username or username(1-100)

   IF NLS_LOWER(password) = NLS_LOWER(username) THEN

     raise_application_error(-20002, 'Password same as or similar to user');

   END IF;

   FOR i IN 1..100 LOOP

      i_char := to_char(i);

      if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN

        raise_application_error(-20005, 'Password same as or similar to user name ');

      END IF;

    END LOOP;

 

   -- Check if the password is same as the username reversed

 

   FOR i in REVERSE 1..length(username) LOOP

     reverse_user := reverse_user || substr(username, i, 1);

   END LOOP;

   IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN

     raise_application_error(-20003, 'Password same as username reversed');

   END IF;

 

   -- Check if the password is the same as server name and or servername(1-100)

   select name into db_name from sys.v$database;

   if NLS_LOWER(db_name) = NLS_LOWER(password) THEN

      raise_application_error(-20004, 'Password same as or similar to server name');

   END IF;

   FOR i IN 1..100 LOOP

      i_char := to_char(i);

      if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN

        raise_application_error(-20005, 'Password same as or similar to server name ');

      END IF;

    END LOOP;

 

   -- Check if the password is too simple. A dictionary of words may be

   -- maintained and a check may be made so as not to allow the words

   -- that are too simple for the password.

   IF NLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN

      raise_application_error(-20006, 'Password too simple');

   END IF;

 

   -- Check if the password is the same as oracle (1-100)

    simple_password := 'oracle';

    FOR i IN 1..100 LOOP

      i_char := to_char(i);

      if simple_password || i_char = NLS_LOWER(password) THEN

        raise_application_error(-20007, 'Password too simple ');

      END IF;

    END LOOP;

 

   -- Check if the password contains at least one letter, one digit

   -- 1. Check for the digit

   isdigit:=FALSE;

   m := length(password);

   FOR i IN 1..10 LOOP

      FOR j IN 1..m LOOP

         IF substr(password,j,1) = substr(digitarray,i,1) THEN

            isdigit:=TRUE;

             GOTO findchar;

         END IF;

      END LOOP;

   END LOOP;

 

   IF isdigit = FALSE THEN

      raise_application_error(-20008, 'Password must contain at least one digit, one character');

   END IF;

   -- 2. Check for the character

   <<findchar>>

   ischar:=FALSE;

   FOR i IN 1..length(chararray) LOOP

      FOR j IN 1..m LOOP

         IF substr(password,j,1) = substr(chararray,i,1) THEN

            ischar:=TRUE;

             GOTO endsearch;

         END IF;

      END LOOP;

   END LOOP;

   IF ischar = FALSE THEN

      raise_application_error(-20009, 'Password must contain at least one \

              digit, and one character');

   END IF;

 

   <<endsearch>>

   -- Check if the password differs from the previous password by at least

   -- 3 letters

   IF old_password IS NOT NULL THEN

     differ := length(old_password) - length(password);

 

     differ := abs(differ);

     IF differ < 3 THEN

       IF length(password) < length(old_password) THEN

         m := length(password);

       ELSE

         m := length(old_password);

       END IF;

 

       FOR i IN 1..m LOOP

         IF substr(password,i,1) != substr(old_password,i,1) THEN

           differ := differ + 1;

         END IF;

       END LOOP;

 

       IF differ < 3 THEN

         raise_application_error(-20011, 'Password should differ from the \

            old password by at least 3 characters');

       END IF;

     END IF;

   END IF;

   -- Everything is fine; return TRUE ;  

   RETURN(TRUE);

END;

/

 

GRANT EXECUTE ON verify_function_11G TO PUBLIC;

 

------接下来是需要修改的地方:原脚本中是使用的alter profile default limit 这样就使得之前defaultprofile参数修改了,因此,最后是新创建一个,当然不一定按照脚本中的创建

-------这里将ALTER 修改为CREATE 新的profile

CREATE PROFILE pro_limit LIMIT

PASSWORD_LIFE_TIME 180

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME 1

PASSWORD_VERIFY_FUNCTION verify_function_11G;

 

------后面还有一个密码复杂函数verify_function,可以执行也可以不执行,该函数主要是旧版本的脚本,现在一般不用

 

 

2.5.3 生成密码复杂性函数

##前面修改了脚本,因此在生成密码复杂性函数的同时会创建一个pro_limitprofile

sys@ORCL>@?/rdbms/admin/utlpwdmg.sql

 

##此时查看系统profile会发现多了一个

select distinct profile from dba_profiles;

 

2.5.4 手工创建profile

##另外我们也可以再创建一个profile,将密码复杂设定为verify_function_11G

###如果要修改原有的profilecreate改为alter即可

CREATE PROFILE pro_sh LIMIT

   FAILED_LOGIN_ATTEMPTS 6

   PASSWORD_LIFE_TIME 60

   PASSWORD_REUSE_TIME 60

   PASSWORD_REUSE_MAX 5

   PASSWORD_VERIFY_FUNCTION verify_function_11G

   PASSWORD_LOCK_TIME 5/1440

   PASSWORD_GRACE_TIME 90;

 

2.5.5 profile概要文件参数释义

 

                   FAILED_LOGIN_ATTEMPTS:最大错误登录次数

                   PASSWORD_GRACE_TIME:口令失效后锁定时间

                   PASSWORD_LIFE_TIME:口令有效时间

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

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

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

                   PASSWORD_VERIFY_FUNCTION:口令复杂度审计函数

 

    解释:

    PASSWORD_LIFE_TIME:口令有效时间,口令使用期限(应用系统帐号暂不修改)。

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

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

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

    FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME通常在一起使用,如下:

    ALTER PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 60;

    ALTER PROFILE default LIMIT PASSWORD_LOCK_TIME 0.5;

 

 

2.5.6 给用户shall指定profile为pro_sh

OEM-》安全性-》概要文件

 

select distinct profile from dba_profiles;

show parameter resource_limit    资源管理的开关参数

 

alter user shall profile pro_sh;

select username, profile from dba_users;

select profile from dba_users where username='SHALL';

 

#还原为默认profile

alter user shall profile default;

select profile from dba_users where username='SHALL';

 

2.5.7 指定profile文件后进行测试

##### alter user xxx identified by xxx replace xxx; 检查密码是否符合要求

 

sys@ORCL>alter user shall identified by shall replace shall;

alter user shall identified by shall replace shall

*

ERROR at line 1:

ORA-28003: password verification for the specified password failed

ORA-20001: Password length less than 8

 

alter user shall identified by "123qweQWE";

conn shall/123qweQWE

 

##使用 conn shall/shall登录6次触发锁定

select username,user_id,lock_date,created from dba_users where username ='SHALL';

 

##此时等待5分钟后用正确的密码又可以登录

##如果需要手工解锁

alter user shall account unlock;

 

##登录用户修改密码

shall@ORCL>password

Changing password for SHALL

Old password:

New password:

Retype new password:

Password changed

 

2.5.8 密码有特殊字符无法登录

##oracle下登录     密码加双引号:用户/"密码"

shall@ORCL>conn shall/123!@#qwe

ERROR:

ORA-12154: TNS:could not resolve the connect identifier specified

shall@ORCL>conn shall/"123!@#qwe"

Connected.

 

##linux下登录    用户到密码加单引号,密码部分加双引号:'用户/"密码"'

sqlplus 'shall/"123!@#qwe"'

sqlplus 'shall/"123!@#qwe"'@orcl

sqlplus 'shall/"123!@#qwe"'@192.168.11.111:1521/orcl.test.com

 

##windows下登录   密码加3个双引号:用户/"""密码"""

sqlplus shall/"""123!@#qwe"""@zyx_test111

sqlplus shall/"""123!@#qwe"""@192.168.11.111:1521/orcl.test.com

 

 

2.6 用户帐号管理

##记录用户列表(创建日期、用户ID、锁定日期)

select * from all_users;

select username,user_id,lock_date,created from dba_users;

####一定要注意解锁用户中用户密码的设定,比如系统默认用户SYSTEM/DBSNMP/SYSMAN/ MGMT_VIEW等,设定为复杂密码

 

###创建用户

create user shall identified by password;

 

###锁定用户及解锁

alter user shall account lock;

alter user shall account unlock;

 

###删除用户及用户相关数据

drop user shall cascade;

 

#1>  对用户登入登出记录trigger

##对用户登录进行记录,记录内容包括用户登录id,登入时间,登出时间,登入的用户,机器名,ip地址,以什么程序登录。(如果数据库是abort不会记录客户端登出记录)

 

create table login_log

  ( session_id int not null,

   login_on_time date,

   login_off_time date,

   user_in_db  varchar2(30),

   machine varchar2(100),

   ip_address varchar2(100),

   run_program varchar2(100)

) ;

 

create  or  replace  trigger  login_on_info

  after logon on database

begin

  insert into login_log (session_id,login_on_time,login_off_time,user_in_db,machine, ip_address,run_program)

  select audsid,sysdate,null,login_user,machine,sys_context ('USERENV','IP_ADDRESS'), program

     from v$session

        where audsid=userenv('SESSIONID');

commit;

end;

/

 

create  or replace  trigger  login_off_info

  before logoff on database

begin

   update login_log set login_off_time=sysdate

       where session_id=userenv('SESSIONID');

exception

   when  others  then  null;

commit;

end;

/

 

SELECT * FROM login_log order by login_off_time desc;

##可以定期做一些备份或者清空login_log

create table login_log2016_07 as select * from login_log;

delete from login_log; commit;   ----truncate table login_log;

 

###停用记录

alter trigger login_on_info disable;

alter trigger login_off_info disable;

drop trigger login_on_info;

drop trigger login_off_info;

drop table login_log;

 

 

#2>  对用户操作重要的表记录trigger

#视情况而定,一般不会用到

##记录对重要表scott_emp的操作记录(只能记录insert update delete的动作,不能记录操作影响的数据)

conn shall/shall

create  table  scott_emp  as  select * from scott.emp;

conn / as sysdba

 

create  table  log_shall_scott_emp

   ( who varchar2(30),

    action  varchar2(20),

    when date

 );

 

create  or  replace  trigger  scott_emp_action

   before insert or update or delete on shall.scott_emp

declare

  l_action  scott_emp_log.action%type;

begin

  if  inserting  then

       l_action := 'insert';

  elsif  updating  then

       l_action := 'update';

  elsif  deleting  then

       l_action := 'delete';

  else

      raise_application_error (-2001,'you shoule never erver get this error.');

  end if;

  insert  into  log_shall_scott_emp(who,action,when) values (user,l_action,sysdate);

end scott_emp_action;

/

 

##停用记录

alter  trigger  scott_emp_action  disable;

drop  trigger  scott_emp_action;

drop  table  log_shall_scott_emp;

 

 

#3>  记录数据库正常启动关闭时间trigger

#目前也不需要了,可以直接在alert告警日志中查看数据库启动关闭时间

###创建该触发器好处是,更直观的看到什么时间启动什么时间关闭,但是不会记录abort异常关闭的记录,但是可以通过启动来推断上一次关闭是否是abort

create  table  log_oracle

  ( eventname  varchar2(30),

   time   date

 );

 

create  or  replace  trigger  tr_startup

  after  startup  on  database

begin

  insert  into  log_oracle  values (ora_sysevent,sysdate);

end;

/

create  or  replace  trigger  tr_shutdown

  before  shutdown  on  database

begin

  insert  into  log_oracle  values (ora_sysevent,sysdate);

end;

/

 

##停用记录

alter  trigger  tr_startup  disable;

alter  trigger  tr_shutdown  disable;

drop  trigger  tr_startup;

drop  trigger  tr_shutdown;

drop  table  log_oracle;

 

 

2.7 数据库审计

#根据业务需要,如果没有特殊要求不用开启,开启审计后对性能有一定影响

###开启审计后需要重启一次系统

#OEM: -->服务器 --> 右边中间 安全性项  有审计设置

 

##查看参数

sys@ORCL>show parameter audit_trail

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_trail                          string      DB

sys@ORCL>show parameter audit_sys_operations

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_sys_operations                 boolean     FALSE

 

##开启审计

alter system set audit_sys_operations=true scope=spfile;

alter system set audit_trail=db scope=spfile;

 

##审计shall用户下scott.scott_emp(当然除了对对象进行审计,还可以对数据库中的任意操作进行审计-----比如审计权限操作 audit create any table,create table by shall by access)

audit all on shall.scott_emp;

##关闭审计

noaudit all on shall.scott_emp;

 

##查看审计log存放目录

SQL> show parameter audit_file_dest

 

##开启审计后,可以到audit_file_dest指定目录下找到审计文件,后缀名为.aud,文件内容会记录关于shall.scott_emp的所有操作,比如 insertupdatedeletedropcreatecommitrollbak等等。内容类型如下:

 

Sat Apr 23 06:50:13 2016 +08:00

LENGTH : '205'

ACTION :[51] 'insert into shall.scott_emp select * from scott.emp'

DATABASE USER:[1] '/'

PRIVILEGE :[6] 'SYSDBA'

CLIENT USER:[6] 'oracle'

CLIENT TERMINAL:[5] 'pts/0'

STATUS:[1] '0'

DBID:[10] '1437652505'

 

与审计相关的表:

select * from dba_audit_trail;

select * from aud$;

 

##关闭审计

noaudit all on table_name;

alter system set audit_sys_operations=false scope=spfile;

 

 

2.8 用户/角色权限管理

##查看用户拥有哪些权限

conn shall/password

select * from role_sys_privs;

select * from user_sys_privs;

select * from user_role_privs;

select * from user_tab_privs;

 

select * from dba_sys_privs where grantee='SHALL';

select * from dba_role_privs where grantee='SHALL';

select * from dba_tab_privs where grantee='SHALL';

 

###授权权限给用户及收回

grant connect,resource to shall;

revoke connect,resource from shall;

 

###创建角色及删除

create role test_role;

drop role test_role;

 

###给角色授予权限及收回

grant select on scott.emp to test_role;

revoke select on scott.emp from test_role;

 

###查看角色拥有哪些权限

select * from dba_sys_privs where grantee='TEST_ROLE';

select * from role_sys_privs where role='TEST_ROLE';

select * from dba_tab_privs where grantee='TEST_ROLE';

 

###查看该角色下包含哪些角色权限

select * from dba_role_privs where grantee='TEST_ROLE';

 

###查看该角色赋予哪些用户

select * from dba_role_privs where granted_role='TEST_ROLE';

 

###查看当前用户拥有权限及角色

select * from role_sys_privs;

###查看用户拥有的系统权限

select * from user_sys_privs;

###查看当前会话权限

select * from session_privs;

 

###把角色授予用户及收回

grant test_role to shall;

revoke test_role from shall;

 

 

2.9 UNLIMITED TABLESPACE权限管理

    UNLIMITED TABLESPACE系统权限

select privilege from role_sys_privs where role='CONNECT'; 

select privilege from role_sys_privs where role='RESOURCE';

    查询CONNECTRESOURCE角色找不到UNLIMITED TABLESPACE这个系统权限。 

 

    Oracle MetaLink得知,UNLIMITED TABLESPACE是为了使10g保持向后兼容性而隐含在RESOURCE/DBA角色中的一个系统权限。从安全性的角度来考虑,在创建用户并且授予RESOURCE角色之后应该回收UNLIMITED TABLESPACE这个系统权限。这里推荐创建一个新角色,比如CALIS_RESOURCE,该角色拥有select privilege from role_sys_privs where role='RESOURCE'; 查询语句所列出的全部系统权限,而在创建新用户的时候则将赋予这个新角色。

 

因此,在授予普通用户resource角色后,需要收回该权限UNLIMITED TABLESPACE权限

revoke  unlimited tablespace  from username;

 

 

####建议:创建角色替代connectresource

create  role  user_role;

grant  create session, create table, create sequence, create trigger, create cluster, create procedure, create indextype, create type, create operator  to  user_role;

select * from dba_sys_privs where grantee='USER_ROLE';

 

grant  user_role  to  zhong;

select  *  from session_privs;

####或者直接授予connectresource角色给新角色,也可以避免授予unlimited tablespace

create role xuan_role;

grant connect,resource to xuan_role;

select * from dba_role_privs where grantee='XUAN_ROLE';

 

用户需要授权 unlimited tablespace权限再单独授权

grant  unlimited tablespace  to  zhong;

 

###注意:这样做后,如果用户表空间中,可以创建表,但是不能插入更新数据,需要授予quota,如:

alter  user  zhong  quota  unlimited  on  users;

 

否则会出现权限不足错误:

ORA-01950: no privileges on tablespace 'USERS'

 

 

####全局

grant  unlimited  tablesapce  to  username;

revoke  unlimited  tablesapce  from  username;

####针对某个表空间

alter  user  username  quota  unlimited  on  tbs_name;

alter  user  username  quota  0  on  tbs_name;

 

2.10 PUBLIC权限管理

 

PUBLIC组中撤回这些权限,如果用户需要单独授予。

REVOKE EXECUTE ON SYS.UTL_HTTP FROM PUBLIC;

REVOKE EXECUTE ON SYS.UTL_FILE FROM PUBLIC;

REVOKE EXECUTE ON SYS.UTL_SMTP FROM PUBLIC;

REVOKE SELECT ON ALL_USERS FROM PUBLIC;

 

查看PUBLIC授予的UTL相关权限

OEM管理器中,服务器->安全性->用户->PUBLIC->已授予的对象权限

 

col pp format a50

set pagesize 999

SELECT s.privilege||' ON '||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable FROM sys.dba_tab_privs s, javasnm l WHERE s.table_name = l.short(+) AND s.grantee='PUBLIC' and s.table_name like 'UTL%';

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30130773/viewspace-2122540/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30130773/viewspace-2122540/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值