Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103728063
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-11 17:46:23

5.8. MySQL用户账户管理

本节描述如何为MySQL服务器的客户端设置账户。讨论了下面的主题:

·         MySQL使用的账户名和密码的含义,以及如何比较你的操作系统所使用的账户名和密码

·         如何设置新账户并移除已有账户

·         如何更改密码

·         安全使用密码指导

·         如何使用安全SSL连接

5.8.1. MySQL用户名和密码

用用户名和客户端或主机定义MySQL账户,用户可以根据这些名称来连接服务器。账户也有密码。MySQL和操作系统使用用户名和密码的方式有几处区别:

·         MySQL用于鉴定目的用户名与WindowsUnix使用的用户名(登录名)没有关系。在Unix中,大多数MySQL客户端默认试图使用当前Unix的用户名作为MySQL用户名来登录,但这样只是为了方便。 默认值可以很容易被覆盖,因为客户端程序允许用-u--user选项来指定用户名。因为这表示任何人可以试图使用任何用户名来连接服务器,除非所有MySQL账户有密码,否则你不能使数据库保持安全。通过为没有密码的账户指定用户名,任何人能够成功连接服务器。

·         MySQL用户名最大客达16字符长。这样可以限制MySQL服务器和客户端之间的硬编码,并且防止通过修改mysql数据库中表的定义来偷窃密码。

:应绝对不要以任何方式修改mysql数据库中的任何表,只能运行MySQL分发中专为此目的提供的脚本。将MySQL系统表重新定义为其它方式会导致未定义的(和不支持的!)行为

操作系统用户名与MySQL用户名完全不相关,甚至最大长度可能不同。例如, Unix用户名限制为8个字符。

·         MySQL密码与登录到你的操作系统的密码没有关系。不需要将你用来登录WindowsUnix机器的密码和你用来访问该机器上的MySQL服务器的密码关联起来。

·         MySQL的加密密码使用自己的算法。该加密算法不同于Unix登录过程使用的算法。MySQL密码加密与PASSWORD()SQL函数的方法相同。Unix密码加密与ENCRYPT()SQL函数的方法相同。PASSWORD()ENCRYPT()函数的描述参见12.9.2节,“加密函数”。从版本4.1 起,MySQL使用更强的鉴定方法,同以前的版本相比可以在连接过程中提供更好的密码保护。即使TCP/IP包被截取或mysql数据库被捕获也很安全。(在前面的版本中,即使密码以加密形式保存到user表中,仍可以通过加密密码值来连接MySQL服务器)

当安装MySQL时,授权表装载时有一系列初使账户。这些账户的名称和访问权限见2.9.3节,“使初始MySQL账户安全”,其中还讨论了如何未这些账户赋予密码。因此,你一般应使用GRANTREVOKE语句来设置、修改和移除MySQL账户。参见13.5.1.3节,“GRANT和REVOKE语法”

当用命令行客户端连接MySQL服务器时,你应为想要使用的账户指定用户名和密码:

shell> mysql --user=monty --password=guess db_name

如果你想用较短的选项,命令应为:

shell> mysql -u monty -pguess db_name

-p选项和后面的密码值之间绝对不能有空格。参见5.7.4节,“与MySQL服务器连接”

前面的命令包括命令行中的密码值,会很危险。参见5.8.6节,“使你的密码安全”。要想避免,指定--password-p选项后面不跟任何密码值:

shell> mysql --user=monty --password db_name
shell> mysql -u monty -p db_name

然后客户端程序输出提示符并等待你输入密码。(在这些示例中,db_name并不为密码,因为用空格将它同前面的密码项隔离开了)

在一些系统中,MySQL用来提示输入密码的库调用自动将密码限制到8个字符。这是系统库的问题,而不是MySQL的问题。MySQL本身并不限制密码的长度。要解决该问题,将MySQL密码改为8个字符和更少字符的值,或将密码放入选项文件中。

5.8.2. 向MySQL增加新用户账户

可以用两种方式创建MySQL账户:

·         使用GRANT语句

·         直接操作MySQL授权表

最好的方法是使用GRANT语句,因为这样更精确,错误少。从MySQL 3.22.11起提供了GRANT;其语法见13.5.1.3节,“GRANT和REVOKE语法”

创建账户的其它方法是使用MySQL账户管理功能的第三方程序。phpMyAdmin即是一个程序。

下面的示例说明如何使用MySQL客户端程序来设置新用户。假定按照2.9.3节,“使初始MySQL账户安全”描述的 默认值来设置权限。这说明为了更改,你必须以MySQL root用户连接MySQL服务器,并且root账户必须有mysql数据库的INSERT权限和RELOAD管理权限。

首先,使用MySQL程序以MySQL root用户来连接服务器:

shell> MySQL --user=root MySQL

如果你为root账户指定了密码,还需要为该MySQL命令和本节中的其它命令提供--password-p选项。

root连接到服务器上后,可以添加新账户。下面的语句使用GRANT来设置四个新账户:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';

GRANT语句创建的账户有下面的属性:

·         其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,具有完全的权限可以做任何事情。一个账户 ('monty'@'localhost')只用于从本机连接时。另一个账户('monty'@'%')可用于从其它主机连接。请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,monty将被视为匿名用户。原因是匿名用户账户的Host列值比'monty'@'%'账户更具体,这样在user表排序顺序中排在前面。(user表排序的讨论参见5.7.5节,“访问控制, 阶段1:连接核实”

·         一个账户有用户名admin,没有密码。该账户只用于从本机连接。授予了RELOADPROCESS管理权限。这些权限允许admin用户执行mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx命令,以及mysqladmin processlist。未授予访问数据库的权限。你可以通过GRANT语句添加此类权限。

·         一个账户有用户名dummy,没有密码。该账户只用于从本机连接。未授予权限。通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限。它可以将所有全局权限设为'N'。假定你将在以后将具体权限授予该账户。

除了GRANT,你可以直接用INSERT语句创建相同的账户,然后使用FLUSH PRIVILEGES告诉服务器重载授权表:

shell> mysql --user=root mysql
mysql> INSERT INTO user
    ->     VALUES('localhost','monty',PASSWORD('some_pass'),
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user
    ->     VALUES('%','monty',PASSWORD('some_pass'),
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
    ->     Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

当你用INSERT创建账户时使用FLUSH PRIVILEGES的原因是告诉服务器重读授权表。否则,只有重启服务器后更改方会被注意到。使用 GRANT,则不需要使用FLUSH PRIVILEGES

INSERT使用PASSWORD()函数是为了加密密码。GRANT语句为你加密密码,因此不需要PASSWORD()

'Y'值启用账户权限。对于admin账户,还可以使用更加可读的INSERT扩充的语法(使用SET)。

在为dummy账户的INSERT语句中,只有user表中的HostUserPassword列记录为指定的值。没有一个权限列为显式设置,因此MySQL将它们均指定为 默认值'N'。这样等同于GRANT USAGE的操作。

请注意要设置超级用户账户,只需要创建一个权限列设置为'Y'user表条目。user表权限为全局权限,因此其它 授权表不再需要条目。

下面的例子创建3个账户,允许它们访问专用数据库。每个账户的用户名为custom,密码为obscure

要想用GRANT创建账户,使用下面的语句:

shell> MySQL --user=root MySQL
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON bankaccount.*
    ->     TO 'custom'@'localhost'
    ->     IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON expenses.*
    ->     TO 'custom'@'whitehouse.gov'
    ->     IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON customer.*
    ->     TO 'custom'@'server.domain'
    ->     IDENTIFIED BY 'obscure';

3个账户可以用于:

·         1个账户可以访问bankaccount数据库,但只能从本机访问。

·         2个账户可以访问expenses数据库,但只能从主机whitehouse.gov访问。

·         3个账户可以访问customer数据库,但只能从主机server.domain访问。

要想不用GRANT设置custom账户,使用INSERT语句直接修改 授权表:

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('localhost','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
    ->     VALUES('server.domain','custom',PASSWORD('obscure'));
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('localhost','bankaccount','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('whitehouse.gov','expenses','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
    ->     (Host,Db,User,Select_priv,Insert_priv,
    ->     Update_priv,Delete_priv,Create_priv,Drop_priv)
    ->     VALUES('server.domain','customer','custom',
    ->     'Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
 

3INSERT语句在user表中加入条目,允许用户custom从各种主机用给定的密码进行连接,但不授予全局权限(所有权限设置为 默认值'N')。后面3INSERT语句在user表中加入条目,为custom授予bankaccountexpensescustomer数据库权限,但只能从合适的主机访问。通常若直接修改 授权表,则应告诉服务器用FLUSH PRIVILEGES重载授权表,使权限更改生效。

如果你想要让某个用户从给定域的所有机器访问(例如,mydomain.com),你可以在账户名的主机部分使用含‘%’通配符的GRANT语句:

mysql> GRANT ...
    ->     ON *.*
    ->     TO 'myname'@'%.mydomain.com'
    ->     IDENTIFIED BY 'mypass';

要想通过直接修改授权表来实现:

mysql> INSERT INTO user (Host,User,Password,...)
    ->     VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);

mysql> FLUSH PRIVILEGES;

5.8.3. 从MySQL删除用户账户

要想移除账户,应使用DROP USER语句,请参见13.5.1.2节,“DROP USER语法”

5.8.4. 限制账户资源

限制MySQL服务器资源使用的一个方法是将max_user_connections系统变量设置为非零值。但是,该方法严格限于全局,不允许管理具体账户。并且,它只限制使用单一账户同时连接的数量,而不是客户端连接后的操作。许多MySQL管理员对两种类型的控制均感兴趣,特别是Internet服务提供者。

MySQL 5.1,你可以为具体账户限制下面的服务器资源:

·         账户每小时可以发出的查询数

·         账户每小时可以发出的更新数

·         账户每小时可以连接服务器的次数

客户端可以执行的语句根据查询限制来记数。只有修改数据库或表的语句根据更新限制来记数。

还可以限制每个账户的同时连接服务器的连接数。

本文中的账户为user表中的单个记录。根据UserHost列值唯一识别每个账户。

做为使用该特性的先决条件,mysql数据库的user表必须包含资源相关的列。资源限制保存在max_questionsmax_updatesmax_connectionsmax_user_connections列内。如果user表没有这些列,必须对它进行升级;参见2.10.2节,“升级授权表”

要想用GRANT语句设置资源限制,使WITH子句来命名每个要限制的资源和根据每小时记数的限制值。例如,要想只以限制方式创建可以访问customer数据库的新账户,执行该语句:

mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
    ->     IDENTIFIED BY 'frank'
    ->     WITH MAX_QUERIES_PER_HOUR 20
    ->          MAX_UPDATES_PER_HOUR 10
    ->          MAX_CONNECTIONS_PER_HOUR 5
    ->          MAX_USER_CONNECTIONS 2;

限制类型不需要全部在WITH子句中命名,但已经命名的可以按任何顺序。每个每小时限制值均应为整数,代表每小时的记数。如果GRANT语句没有WITH子句,则每个限制值设置为 默认值零(即没有限制)。对于MAX_USER_CONNECTIONS,限制为整数,表示账户一次可以同时连接的最大连接数。如果限制设置为 默认值零,则根据MAX_USER_CONNECTIONS系统变量确定该账户可以同时连接的数量。

要想设置或更改已有账户的限制,在全局级别使用GRANT USAGE语句(*.*)。下面的语句可以将francis的查询限制更改为100

mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
    ->     WITH MAX_QUERIES_PER_HOUR 100;

该语句没有改变账户的已有权限,只修改了指定的限制值。

要想取消已有限制,将该值设置为零。例如,要想取消francis每小时可以连接的次数的限制,使用该语句:

mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
    ->     WITH MAX_CONNECTIONS_PER_HOUR 0;

当账户使用资源时如果有非零限制,则对资源使用进行记数。

服务器运行时,它统计每个账户使用资源的次数。如果账户在最后一个小时的连接次数达到限制,该账户的进一步的连接被拒绝。类似地,如果账户达到查询或更新次数的限制,进一步的查询或更新被拒绝。在这种情况下,会给出相关错误消息。

根据每个账户进行资源计算,而不是根据每个客户端。例如,如果你的账户的查询限制为50,你不能通过两个客户端同时连接服务器将限制增加到100。两个连接的查询被计算到一起。

可以为所有账户从全局重设当前的每小时资源使用记数,或单独重设给定的账户:

·         要想将所有账户当前的记数重设为零,可以执行FLUSH USER_RESOURCES语句。还可以通过重载授权表来重设记数(例如,使用FLUSH PRIVILEGES语句或mysqladmin reload命令)

·         将具体账户的限制重新授予任何值,可以将它设置为零。要想实现,按照前面所述使用GRANT USAGE,并将限制值指定为该账户当前的限制值。

计数器重设不影响MAX_USER_CONNECTIONS限制。

当服务器启动时所有记数从零开始。

5.8.5. 设置账户密码

  • 可以用mysqladmin命令在命令行指定密码:
    shell> mysqladmin -u user_name -h host_name password "newpwd"

    该命令重设密码的账户为user表内匹配User列的user_nameHost你发起连接的客户端的记录。

    为账户赋予密码的另一种方法是执行SET PASSWORD语句:

    mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');

    只有root等可以更新mysql数据库的用户可以更改其它用户的密码。如果你没有以匿名用户连接,省略FOR子句便可以更改自己的密码:

    mysql> SET PASSWORD = PASSWORD('biscuit');

    你还可以在全局级别使用GRANT USAGE语句(*.*)来指定某个账户的密码而不影响账户当前的权限:

    mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

    一般情况下最好使用上述方法来指定密码,你还可以直接修改user表:

    ·         要想在创建新账户时建立密码,在Password列提供一个值:

    ·                shell> mysql -u root mysql
    ·                mysql> INSERT INTO user (Host,User,Password)
    ·                     -> VALUES('%','jeffrey',PASSWORD('biscuit'));
    ·                mysql> FLUSH PRIVILEGES;
    ·                 

    ·         要想更改已有账户的密码,使用UPDATE来设置Password列值:

    ·                shell> mysql -u root mysql
    ·                 mysql> UPDATE user SET Password = PASSWORD('bagel')
    ·                       -> WHERE Host = '%' AND User = 'francis';
    ·                mysql> FLUSH PRIVILEGES;

    当你使用SET PASSWORDINSERTUPDATE指定账户的密码时,必须用PASSWORD()函数对它进行加密。(唯一的特例是如果密码为空,你不需要使用PASSWORD())。需要使用PASSWORD()是因为user表以加密方式保存密码,而不是明文。如果你忘记了,你可能会象这样设置密码:

    shell> mysql -u root mysql
    mysql> INSERT INTO user (Host,User,Password)
        -> VALUES('%','jeffrey','biscuit');
    mysql> FLUSH PRIVILEGES;
     

    结果是密码'biscuit'保存到user表后没有加密。当jeffrey使用该密码连接服务器时,值被加密并同保存在user表中的进行比较。但是,保存的值为字符串'biscuit',因此比较将失败,服务器拒绝连接:

    shell> mysql -u jeffrey -pbiscuit test
    Access denied

    如果你使用GRANT ... IDENTIFIED BY语句或mysqladmin password命令设置密码,它们均会加密密码。在这种情况下,不需要使用 PASSWORD()函数。

    释:PASSWORD()加密不同于Unix密码加密。参见5.8.1节,“MySQL用户名和密码”

5.8.6. 使你的密码安全

在管理级别,你决不能将mysql.user表的访问权限授予任何非管理账户。

当你运行客户端程序连接MySQL服务器时,以一种暴露的可被其他用户发现的方式指定你的密码是不妥当的。当你运行客户端程序时,你可以使用下列方法指定你的密码,还有每个方法的风险评估:

·         使用一个在命令行上-pyour_pass--password=your_pass的选项。例如:

·                shell> mysql -u francis -pfrank db_name

这很方便但是不安全,因为你的密码对系统状态程序(例如ps)变得可见,它可以被其他的用户调用来显示命令行。一般MySQL客户在他们的初始化顺序期间用零覆盖命令行参数,但是仍然有一个短暂间隔时间内参数值可见的。

·         使用一个-p--password选项(没有指定密码)。在这种情况下,客户端程序请求来自终端的密码:

·                shell> mysql -u francis -p db_name
·                Enter password: ********

 *字符指示输入密码的地方。输入密码时密码看不见。

因为它对其他用户不可见,与在命令行上指定它相比,这样进入你的密码更安全。然而,这个输入一个密码的方法仅仅为你交互式运行程序是合适的。如果你想要从非交互式运行的一个脚本调用一个客户端,就没有从终端输入入密码的机会。在某些系统中,你甚至会发现脚本的第一行被(错误地)读并解释为你的密码!

·         在一个配置文件中存储你的密码。例如,在Unix中,你可在主目录的.my.cnf文件中的[client]节列出你的密码:

·                [client]
·                password=your_pass

如果你在.my.cnf里面存储密码,除了你本人其它人不能访问该文件。保证文件的访问模式是400600例如:

shell> chmod 600 .my.cnf

关于选项文件的详细讨论参见4.3.2节,“使用选项文件”

·         你可在MYSQL_PWD环境变量中存储密码。但是这种指定MySQL密码的方法是极不安全的,不应该使用。ps的某些版本包括显示运行进程的环境的选项;如果你设定MYSQL_PWD,你的密码将被运行ps的所有人看见,甚至在没有这样一个版本的ps的系统上,没有其它方法观察到进程环境的假设是不明智的。参见附录F:环境变量

总之,最安全的方法是让客户端程序提示输入密码或在适当保护的选项文件中指定密码。

5.8.7. 使用安全连接

MySQL支持MySQL客户端和服务器之间的安全(加密的)连接所使用的安全套接字层(SSL)协议。本节讨论如何使用SSL连接。还描述了在Windows中设置SSH的方法。

MySQL的标准配置倾向于尽可能快,因此默认情况不使用加密连接。使用该协议会使客户端/服务器协议慢得多。对数据进行加密非常耗CPU,需要计算机多做许多工作,会延迟MySQL的其它任务。对于需要通过加密连接提供安全的应用程序,可以保证额外的计算。

MySQL允许在连接前启用加密。你可以根据具体应用程序的需求选择普通未加密连接或安全加密SSL连接。

5.8.7.1. SSL基本概念

要想理解MySQL如何使用SSL,需要解释一些基本SSLX509概念。熟悉的人们可以跳过该部分。

默认情况下,MySQL在客户端和服务器之间使用未加密的连接。这说明可以访问网络的部分人可以看到你的通信,并看到发送和接收的数据。他们甚至可以更改在客户端和服务器之间传递的数据。要想提高安全性,当调用客户端程序时,你可以通过--compress选项压缩客户端/服务器之间的通信。但是,这样并不能阻挡住顽固的攻击者。

当你需要以安全方式在网络中传递信息时,未加密的连接是不可接受的。加密是使任何数据不可读的方法。事实上,今天的许多惯例需要加密算法提供更加安全的要素。它们应能抵抗各种已知的攻击,例如更改加密消息的顺序或两次重放数据。

SSL是一种使用不同的加密算法确保从公用网接收到的数据是可信的协议。它具有检测数据更改、丢失或重放的机制。SSL还包括使用 X509标准提供身份认证的算法。

使用X509,可以识别Internet上的某些人。通常用于电子商务应用程序中。按照基本概念,应有某种称之为“认证机构(CA)的机构,可以向请求者分发电子证书。证书依赖非对称加密算法,有两个加密密钥(公共密钥和私人密钥)。认证持有者可以向其它方出示证书来证明身份。证书包括持有者的公共密钥。只能使用对应的私人密钥对含该公共密钥的加密数据进行解密,私人密钥由证书持有者拥有。

如果你需要关于SSLX509、或加密的详细信息,使用Internet搜索引擎来搜索你感兴趣的关键字。

5.8.7.2. 需求(OpenSSL)

要想在MySQL服务器和客户端程序之间使用SSL连接,系统必须能够支持OpenSSL。如果用支持内嵌式yaSSLMySQL版本,不要读该节,但应阅读5.8.7.3节,“使用yaSSL”

要想获得安全的MySQL连接,必须:

1.    安装OpenSSL库。我们已经测试了带OpenSSL 0.9.6MySQL。如果你需要OpenSSL,请访问

2.    配置MySQL,用--with-vio--with-openssl选项运行configure脚本。

3.    确保升级了授权表,使mysql.user表内包含SSL相关列。如果 授权表是从MySQL 4.0.0之前的版本升级,这很重要。升级过程见2.10.2节,“升级授权表”

4.    要想检查是否运行的mysqld服务器支持OpenSSL,应检查have_openssl系统变量的值:

5.            mysql> SHOW VARIABLES LIKE 'have_openssl';
6.            +---------------+-------+
7.            | Variable_name | Value |
8.            +---------------+-------+
9.            | have_openssl  | YES   |
10.        +---------------+-------+

如果值为YES,服务器支持OpenSSL连接。

5.8.7.3. 使用yaSSL

使用MySQL的内嵌式yaSSL支持,可以很容易地使用安全连接。不需要安装OpenSSL和执行5.8.7.2节,“需求(OpenSSL)”中的步骤。并且,MySQLyaSSL使用相同的许可模型。

当前,在以下平台上支持yaSSL

·         Linux/x86-64 Red Hat Enterprise 3.0

·         Linux RHAS21 Itanium-2,带gcc,静态链接

·         Linux Itanium-2,带gcc

·         Windows

当从源码构建MySQL时如果你想要启用yaSSL,应这样配置MySQL

./configure --with-yassl=yes

要想启动MySQL服务器支持yaSSL,使用支持OpenSSL的相同的选项,并识别建立安全连接需要的证书:

shell> mysqld --ssl-ca=cacert.pem \
       --ssl-cert=server-cert.pem \
       --ssl-key=server-key.pem

·         --ssl-ca识别认证机构证书。

·         --ssl-cert识别服务器证书。

·         --ssl-key识别客户证书。

要想用yaSSL支持建立与MySQL服务器的安全连接,应这样启动客户端:

shell> mysql --ssl-ca=cacert.pem \
       --ssl-cert=server-cert.pem \
       --ssl-key=server-key.pem

换句话说,选项与服务器的相同,并且认证机构证书必须相同。

要想从应用程序建立安全连接,调用mysql_real_connect()之前,应使用mysql_ssl_set()API函数来设置相应认证选项。参见25.2.3.64节,“mysql_ssl_set()”

5.8.7.4. 为MySQL设置SSL证书

下面是一个为MySQ设置SSL证书的例子:
DIR=`pwd`/openssl
PRIV=$DIR/private
 
mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf
 
# Create necessary files: $database, $serial and $new_certs_dir
# directory (optional)
 
touch $DIR/index.txt
echo "01" > $DIR/serial
 
#
# Generation of Certificate Authority(CA)
#
 
openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \
    -config $DIR/openssl.cnf
 
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:
 
#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out \
    $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf
 
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
 
#
# Remove the passphrase from the key (optional)
#
 
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem
 
#
# Sign server cert
#
openssl ca  -policy policy_anything -out $DIR/server-cert.pem \
    -config $DIR/openssl.cnf -infiles $DIR/server-req.pem
 
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
 
#
# Create client request and key
#
openssl req -new -keyout $DIR/client-key.pem -out \
    $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf
 
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................++++++
# .............................................++++++
# writing new private key to '/home/monty/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
 
#
# Remove a passphrase from the key (optional)
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem
 
#
# Sign client cert
#
 
openssl ca  -policy policy_anything -out $DIR/client-cert.pem \
    -config $DIR/openssl.cnf -infiles $DIR/client-req.pem
 
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName           :PRINTABLE:'FI'
# organizationName      :PRINTABLE:'MySQL AB'
# commonName            :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
 
#
# Create a my.cnf file that you can use to test the certificates
#
 
cnf=""
cnf="$cnf [client]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/client-cert.pem"
cnf="$cnf ssl-key=$DIR/client-key.pem"
cnf="$cnf [mysqld]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/server-cert.pem"
cnf="$cnf ssl-key=$DIR/server-key.pem"
echo $cnf | replace " " '
' > $DIR/my.cnf

 

要想测试SSL连接,按下面方法启动服务器,其中$DIR是示例my.cnf选项文件安装的路径名:

shell> MySQLd --defaults-file=$DIR/my.cnf &

然后使用相同的选项文件调用客户端程序:

shell> MySQL --defaults-file=$DIR/my.cnf

如果你有MySQL源码分发版,还可以修改前面的my.cnf文件来指向SSL目录中的示范证书和密钥文件来测试你的设置。

阅读(900) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~