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 解锁后,用户没有密码,要及时设定密码
对于passwd和shadow有没有更好的保护方法呢?
如果系统暂时不会添加新的用户,并且不会改用户密码时,可以将这两个文件锁住。
示列:
[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 ## OUTPUT为DROP时添加
/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 ## OUTPUT为DROP时添加
#如果服务器有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.ORA和LISTENER.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
#解析顺序tns和Easy Connect Naming Method(TNSNAMES,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,执行该脚本后,会生成一个密码复杂性函数,并且会更改default的profile参数设定,一般我们保留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 这样就使得之前default的profile参数修改了,因此,最后是新创建一个,当然不一定按照脚本中的创建
-------这里将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_limit的profile
sys@ORCL>@?/rdbms/admin/utlpwdmg.sql
##此时查看系统profile会发现多了一个
select distinct profile from dba_profiles;
2.5.4 手工创建profile
##另外我们也可以再创建一个profile,将密码复杂设定为verify_function_11G
###如果要修改原有的profile将create改为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_ATTEMPTS和 PASSWORD_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的所有操作,比如 insert、update、delete、drop、create、commit、rollbak等等。内容类型如下:
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';
查询CONNECT和RESOURCE角色找不到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;
####建议:创建角色替代connect及resource
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;
####或者直接授予connect和resource角色给新角色,也可以避免授予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/