Linux 系统与数据库安全

Linux 系统与数据库安全

 

http://netkiller.github.com/article/security.html

 

Mr. Neo Chen (netkiller), 陈景峰(BG7NYT)

<openunix@163.com>

版权 2011, 2012 http://netkiller.github.com

摘要

Linux 系统安全问题

下面是我多年积累下来的经验总结,整理成文档供大家参考:

 

Netkiller Architect 手札 Netkiller Linux 手札 Netkiller Developer 手札 Netkiller Database 手札
Netkiller Debian 手札 Netkiller CentOS 手札 Netkiller FreeBSD 手札 Netkiller Shell 手札
Netkiller Web 手札 Netkiller Monitoring 手札 Netkiller Storage 手札 Netkiller Mail 手札
Netkiller Security 手札 Netkiller Multimedia 手札 Netkiller Writer 手札 Netkiller Version 手札
Netkiller PostgreSQL 手札 Netkiller MySQL 手札 Netkiller Cryptography 手札 Netkiller Cisco IOS 手札
Netkiller LDAP 手札 Netkiller Intranet 手札

 


目录

1. 帐号安全1.1. Shell 安全1.2. .history 文件2. 数据库安全2.1. 数据库客户端安全2.1.1. mysql 管理2.1.2. ~/.mysql_history2.2. mysqldump 安全2.2.1. 数据备份2.2.2. 数据恢复2.3. 数据库归档文件2.4. 开发与测试环境的数据库安全问题3. 其他安全问题3.1. 与数据库有关的服务器安全问题

1. 帐号安全

帐号权限安全

1.1. Shell 安全

需求:限制用户权限,仅提供一些linux常用命令,用户监控linux系统于网络运行情况,不允许用户ssh登录后随意运行linux命令

  1. 用户不能进入到Shell环境

    例如普通用户一旦登录web服务器可以看到web程序中的数据库配置

  2. 用户可以了解OS工作状态如内存,cpu,网络等等

    例如:ping, tracepath, top, free, netstat

  3. 可以查看系统部分日志

    例如:access.log, error.log, php-error.log ...

使用mgmt替代bash

#!/bin/bash
TITLE="Client"

#USER=$(whiptail --inputbox "User:" 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)

#PASSWD=$(whiptail --title "$TITLE" --passwordbox "Passsword:" 8 60 3>&1 1>&2 2>&3)

COMMAND=$(whiptail --title "$TITLE" --menu "Administrator Tools" 22 50 10 \
"ping" "ping" \
"tracepath" "tracepath" \
"top" "top" \
"free" "free"  \
"ps" "ps"  \
"netstat" "netstat"  \
"lsof" "lsof"  \
"iftop" "iftop"  \
"log" "log" \
3>&1 1>&2 2>&3)

function option(){
OPTION=$(whiptail --inputbox "COMMAND-LINE Options: " 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)
}

function weblog(){
LOG=$(whiptail --title "$TITLE" --menu "Logs" 22 50 8 \
"/var/log/messages" "message"  \
"/var/log/syslog" "syslog"  \
"/var/log/nginx/access.log" "access.log" \
"/var/log/nginx/error.log" "error.log"  \
3>&1 1>&2 2>&3)

}

case $COMMAND in
ping)
    option
    $COMMAND $OPTION
    ;;
tracepath)
    option
    $COMMAND $OPTION
    ;;
free)
    $COMMAND -m
    read
    ;;
top|iftop)
    $COMMAND
    ;;
log)
    weblog
    tail -f $LOG
    ;;
ps|lsof)
    option
    $COMMAND $OPTION
    read
    ;;
netstat)
    option
    $COMMAND $OPTION
    read
    ;;
*)
    exit $?
esac

Shell 启动文件,主要用户隐藏 /srv/sbin/mgmt 文件(针对菜鸟)


$ cat shell.c
#include <stdlib.h>
main()
{
	for (;;){
		system("/srv/sbin/mgmt");
	}
}

编译.c文件

gcc shell.c -o /bin/nsh
			

添加Shell到/etc/shells

echo /bin/nsh >> /etc/shells
			

将用户shell更改为我们刚刚创建的nsh

$ vim /etc/passwd

www:x:33:33:www:/var/www:/bin/nsh
 			

现在来作一个测试,如果正确应该现在为下面的TUI界面

ssh www@example.com

              ┌───────────────────┤ Client ├───────────────────┐
              │ Administrator Tools                            │
              │                                                │
              │               ping      ping                   │
              │               tracepath tracepath              │
              │               top       top                    │
              │               free      free                   │
              │               ps        ps                     │
              │               netstat   netstat                │
              │               lsof      lsof                   │
              │               iftop     iftop                  │
              │               log       log                    │
              │                                                │
              │                                                │
              │           <Ok>               <Cancel>          │
              │                                                │
              └────────────────────────────────────────────────┘        

提示

这里采用的方式是给用户提供一个界面的方式,另外还有更好的方案,你可以些一个Shell的外壳,你需要实现

  1. 与Shell相同的提示符
  2. 提供TAB补齐
  3. 上下光标键翻看历史命令,左右光标改变位置,Home/End 键到行首与行尾
  4. Ctrl+R 搜索, Ctrl+D 退出
  5. Ctrl+S,Ctrl+Q 等等

流程

用户输入 -> 关键字过滤 -> 放行
				

例如用户输入 cd / 经过过滤器后, cd /home/usr/

例如用户输入 cd /aaa 经过过滤器后, cd /home/usr/aaa

rm -rf /usr/local 提示拒绝等等

我已经使用Python实现上面的大部分功能(因为python受到很多限制)如果使用C可以100%实现,需要你的想想力了

1.2. .history 文件

SA的操作记录问题

通过~/.bash_history文件记录系统管理员的操作记录,定制.bash_history格式

HISTSIZE=1000
HISTFILESIZE=2000
HISTTIMEFORMAT="%Y-%m-%d-%H:%M:%S "
export HISTTIMEFORMAT
			

看看实际效果

$ history | head
    1  2012-02-27-09:10:45 do-release-upgrade
    2  2012-02-27-09:10:45 vim /etc/network/interfaces
    3  2012-02-27-09:10:45 vi /etc/network/interfaces
    4  2012-02-27-09:10:45 ping www.163.com
			

2. 数据库安全

我们以MySQL为例,讲解怎样控制DBA权限。稍加修改即可用于oracle等服务器

  1. DBA 没有系统SSH帐号,只有数据库帐号
  2. 系统管理员只能有SSH系统帐号,没有数据库帐号
  3. DBA 可备份数据库,还原数据库指定的备份文件,但是接触不到备份文件
  4. DBA 有权重启数据库以及修复损坏库/表文件,通过工具完成,而不是登录SSH运行命令

2.1. 数据库客户端安全

DBA不需要通过SSH登录数据库服务器,然后运行mysql/sqlplus在登录数据库

2.1.1. mysql 管理

$ cat ../database/mysqltui
#!/bin/bash
TITLE="MySQL Client"

HOST=$(whiptail --title "$TITLE" --menu "MySQL Host" 22 50 8 \
"127.0.0.1" "localhost" \
"172.16.0.1" "MySQL Master" \
"172.16.0.2" "MySQL Slave 1" \
"172.16.0.3" "MySQL Slave 2"  \
3>&1 1>&2 2>&3)

USER=$(whiptail --inputbox "MySQL User:" 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)

PASSWD=$(whiptail --title "$TITLE" --passwordbox "MySQL Password:" 8 60 3>&1 1>&2 2>&3)

#DATABASE=$(mysqlshow -h$HOST -u$USER | egrep -o "|\w(.*)\w|" | grep -v "Databases" |awk '{print "\""$1"\" \""$1"\""}')
#DATABASE=$(mysqlshow -h$HOST -u$USER | egrep -o "|\w(.*)\w|" | grep -v "Databases" |awk "{print \"$1\" \"$1\"}")

#DB=$(whiptail --title "$TITLE" --menu "MySQL DATABASE" 22 50 8 $DATABASE  3>&1 1>&2 2>&3)

DATABASE=$(whiptail --inputbox "MySQL Database:" 8 60 --title "$TITLE" 3>&1 1>&2 2>&3)

echo $HOST $USER $PASSWD $DATABASE

mysql -h$HOST -u$USER -p$PASSWD $DATABASE

 

             ┌───┤ MySQL Adminstrator ├───┐
             │ Menu                       │
             │                            │
             │       1 MySQL Manager      │
             │       2 MySQL Backup       │
             │       2 MySQL Restore      │
             │                            │
             │                            │
             │    <Ok>        <Cancel>    │
             │                            │
             └────────────────────────────┘             
        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Database Host                        │
        │                                      │
        │        127.0.0.1  localhost          │
        │        172.16.0.1 mysql master       │
        │        172.16.0.2 mysql slave        │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘  

/etc/php5/fpm/pool.d/www.conf

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ User                                 │
        │                                      │
        │ root________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘   

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Password                             │
        │                                      │
        │ ****________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘ 

进入mysql客户端

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 503
Server version: 5.1.58-1ubuntu1 (Ubuntu)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 				

安全提示

  1. 从安全角度看,你可以去掉输入密码的过程。在终端提示符下输入

    Enter password:

  2. 还可以写入~/.my.conf文件

    这样ssh mysql@example.com的时候输入第一道密码,然后进入mysql不需要输入密码

  3. 如果需要输入密码对话到建议删除.bash_history

    rm -rf .bash_history

    ln -s /dev/null .bash_history

2.1.2. ~/.mysql_history

通过~/.mysql_history文件记录DBA操作记录

插入时间点,在~/.bashrc中加入下面命令

cat >> ~/.bashrc <<EODdd
echo `date` >> ~/.mysql_dhistory
EOD
$ tail ~/.bashrc
echo `date` >> ~/.mysql_history
				

查看实际效果

$ tail ~/.mysql_history
EXPLAIN SELECT * FROM stuff where id=3 \G
EXPLAIN SELECT * FROM stuff where id='3' \G
EXPLAIN SELECT * FROM stuff where id='2' \G
Mon Feb 27 09:15:18 CST 2012
EXPLAIN SELECT * FROM stuff where id='2' and created = '2012-02-01' \G
EXPLAIN SELECT * FROM stuff where id='1' and created = '2012-02-01' \G
EXPLAIN SELECT * FROM stuff where id='3' and created = '2012-02-01' \G
EXPLAIN SELECT * FROM stuff where id='2' and created = '2012-02-01' \G
EXPLAIN SELECT * FROM stuff where id='2' or created = '2012-02-01' \G
EXPLAIN SELECT * FROM stuff where id='2' and created = '2012-02-01' \G
Mon Feb 27 11:48:37 CST 2012
				

2.2. mysqldump 安全

2.2.1. 数据备份

MySQL Client
             ┌───┤ MySQL Adminstrator ├───┐
             │ Menu                       │
             │                            │
             │       1 MySQL Manager      │
             │       2 MySQL Backup       │
             │       2 MySQL Restore      │
             │                            │
             │                            │
             │    <Ok>        <Cancel>    │
             │                            │
             └────────────────────────────┘             
MySQL Client
        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Database Host                        │
        │                                      │
        │        127.0.0.1  localhost          │
        │        172.16.0.1 mysql master       │
        │        172.16.0.2 mysql slave        │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘        

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ User                                 │
        │                                      │
        │ root________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘   

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Password                             │
        │                                      │
        │ ****________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘              			

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Backup File Name                     │
        │                                      │
        │ 2010-12-12.01:00:00_________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘        

        ┌────────┤ MySQL Adminstrator ├────────┐
        │                                      │
        │ Backup?                              │
        │                                      │
        │                                      │
        │        <Yes>           <No>          │
        │                                      │
        └──────────────────────────────────────┘       			

2.2.2. 数据恢复

 

MySQL Client
             ┌───┤ MySQL Adminstrator ├───┐
             │ Menu                       │
             │                            │
             │       1 MySQL Manager      │
             │       2 MySQL Backup       │
             │       2 MySQL Restore      │
             │                            │
             │                            │
             │    <Ok>        <Cancel>    │
             │                            │
             └────────────────────────────┘  		
        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Database Host                        │
        │                                      │
        │        127.0.0.1  localhost          │
        │        172.16.0.1 mysql master       │
        │        172.16.0.2 mysql slave        │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘ 

 

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Backup History                       │
        │                                      │
        │        1  2010-12-03 03:00:00        │
        │        2  2012-01-01 02:00:00        │
        │        3  2012-02-01 02:00:00        │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘ 
        ┌────────┤ MySQL Adminstrator ├────────┐
        │ User                                 │
        │                                      │
        │ root________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘  

        ┌────────┤ MySQL Adminstrator ├────────┐
        │ Password                             │
        │                                      │
        │ ****________________________________ │
        │                                      │
        │       <Ok>           <Cancel>        │
        │                                      │
        └──────────────────────────────────────┘                                  			
        ┌────────┤ MySQL Adminstrator ├────────┐
        │                                      │
        │ Restore?                             │
        │                                      │
        │                                      │
        │        <Yes>           <No>          │
        │                                      │
        └──────────────────────────────────────┘  

2.3. 数据库归档文件

一般数据库服务器上可以保留一周的备份数据,历史数据需要保存到服务器以外的带库或者阵列柜中,怎么样保证这些数据的安全呢? 我们采用下面方式

  1. 制作PGP/GPG密钥,密钥放置在数据库服务器上,证书做好备份,否则一旦丢失,将无法在将备份文件恢复
  2. 数据库备份后,首先进行压缩处理
  3. 然后使用公钥证书进行GPG/PGP数据加密
  4. 这时可以放心的将备份数据库搬出数据库服务器到带库或磁盘阵列柜中

恢复数据,将数据库备份文件复制到该数据库服务器,然后用私钥解密备份文件,再恢复到数据库到中

2.4. 开发与测试环境的数据库安全问题

有时候需要将生产环境的数据复制到开发环境上,例如,测试的时候,重现bug需要真实数据,开发环境的模拟数据无法满足要求,这时需要将生产环境的数据拉到测试或开发环境。如果保证数据的安全非常重要。

最有效的手段是数据混淆,将重要的数据进行混淆扰乱顺序等等

扰乱手段有

  1. 颠倒顺序
  2. 曾加干扰词
  3. 重置或替换数据,例如密码可以全部改为test (update user set passwd='test')
  4. 拼装数据 如 (131,137,135,133,139,138,168)后面加8位随机数

3. 其他安全问题

3.1. 与数据库有关的服务器安全问题

其他服务器不能安装mysql客户端与mysqldump备份工具

例如:web服务器只能通过php/jdbc/odbc等链接mysql数据库
web服务器卸载 mysql,mysqldump工具,防止用户登录查询以及将数据库远程备份,然后通过web下载数据库

同时封锁22等端口,避免相互跳转

lokkit --enabled
iptables -F
iptables -A OUTPUT -p tcp -m multiport --dports 22,21,2049 -j REJECT
/etc/init.d/iptables save
iptables -L -n
			

web 服务器禁止使用ssh,作为跳板机

时间: 2024-12-02 21:02:04

Linux 系统与数据库安全的相关文章

查看Linux系统版本信息的方法小结

  如何查看Linux系统使用的版本信息呢? 下面这篇文章收集.整理了一些常见的查看Linux系统版本的方法.由于手头只有Oracle Linux.Centos Linux.Redhat Linux三个版本Linux,所以像Debian.Ubuntu之类的Linux系统,下面方法在这些版本都没测试过. 1:more /etc/issue 命令查看 1.1 Oracle Linux 代码如下: [root@DB-Server ~]# more /etc/issueOracle Linux Serv

Linux 系统应用编程——进程基础

一.Linux下多任务机制的介绍          Linux有一特性是多任务,多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务.          多任务操作系统使用某种调度(shedule)策略(由内核来执行)支持多个任务并发执行.事实上,(单核)处理器在某一时刻只能执行一个任务.每个任务创建时被分配时间片(几十到上百毫秒),任务执行(占用CPU)时,时间片递减.操作系统会在当前任务的时间片用完时调度执行其他任务.由于任务会频繁地切换执行,因此给用户多

日志-linux系统下有Sense Key:recovered error [current]错误

问题描述 linux系统下有Sense Key:recovered error [current]错误 日志里有大量如图报警,不知道是什么原因引起的,查了ASC和ASCP也没有什么结果,拜托有知道的大神,给小弟指条明路 解决方案 看看是不是硬盘有坏道,或者文件破坏 参考:http://blog.itpub.net/25362835/viewspace-1058637/ 解决方案二: http://bbs.chinaunix.net/thread-4086486-1-1.html

ext下拉框在linux系统下,输入框有XX的关闭

问题描述 ext下拉框在linux系统下,输入框有XX的关闭 如果所示,在linux系统,可输入的下拉框有XX的按钮,但是本地却没有,不知道这个该怎么设置,现在的问题是,linux系统上点那个XX没有效果,点击为空后,鼠标放到别的地方时,当时选得值又出现了,有没有人知道这个梗.

免费-linux系统漏洞检测,可生成报告

问题描述 linux系统漏洞检测,可生成报告 linux主机系统漏洞检测,求推荐几款免费的漏洞扫描软件,只检测主机上的漏洞,不用扫描网络,我们有办公的内网,只扫描内网的主机即可,有什么推荐吗??? 解决方案 openvas很强大的漏洞扫描工具

ssh linux-从本机往虚拟机(linux系统)上传东西

问题描述 从本机往虚拟机(linux系统)上传东西 遇到一个特别匪夷所思的问题,本机安装了虚拟机,想用SecureCRT或WinSCP软件通过SSH协议把本机的JAR包上传到虚拟机,可就是传不上去,上传过程中软件如同死机一样没有反映.但上传word文档(小文件)就能传上去. 同事用他们的电脑用同样的方式连我的虚拟机就可以传我传不上的文件,请求下牛人们这是怎么回事,百思不得其解? 解决方案 是不是防火墙什么的过滤掉了啊?我猜测 解决方案二: 是不是本地杀毒软件拦截

Linux系统针对网卡中断的优化处理

中断: 当网卡接收到数据包后,会触发硬中断,通知CPU来收包.硬中断是一个CPU和网卡交互的过程.这其实会消耗CPU资源.特别是在使用速度极快的万兆网卡之后,大量的网络交互使得CPU很大一部分资源消耗在网卡中断处理上.此时,瓶颈并不在网卡,而是在CPU上.因此,现在的网卡都采用多队列的技术,用于充分利用多核心CPU. 中断的详细解释:<Linux的中断和异常扫盲笔记> SMP IRQ affinity 为了防止多个设置发送相同的中断, Linux设计了一套中断请求系统, 使得计算机系统中的每个

linux系统中root用户不能登录怎么办?

问题描述 linux系统中root用户不能登录怎么办? 自从我更改了Linux系统的IP地址,root用户就不能登录了,root用户登录提示"鉴定故障".普通用户可以登录,能用su命令登录root用户,但是不能直接登录. 解决方案 如果没有给ROOT设置密码,就用普通用户登录,没有普通用户这是不可能的登录进入终端,直接输入 sudo passwd root输入普通用户密码输入你要设置的root密码重复root密码这样用root就行了 解决方案二: 终端输入:sudo gedit /us

阿里云使用Linux系统应用配置有哪些问题

Linux下如何进行FTP设置 ECS Linux服务器如何配置网站以及绑定域名 Ubuntu安装vncserver实现图形化访问 阿里云Docker镜像库 ECS linux中添加ftp用户,并设置相应的权限 CentOS6.5安装vncserver实现图形化访问 Linux SCP命令复制传输文件的用法 Mysql,phpmyadmin密码忘了怎么办 Linux下l2tp客户端xl2tpd的安装配置 使用SFTP方式传输文件 ECS Linux系统盘网站数据更换至数据盘 WDCP的报错处理