So Tired !_! 逆水行舟, 不进则退!

12Dec/13

SET 和 SHOW语法(一)

Posted by Nick Xu

SET 可以用于设置各种变量或者选项。

SHOW 可以以各种形式描述数据库系统的信息,诸如数据表,字段,服务器状态等等。大致有以下这些方法:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CREATE DATABASE db_name
SHOW CREATE TABLE tbl_name
SHOW DATABASES [LIKE 'pattern']
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW INNODB STATUS
SHOW [BDB] LOGS
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW STATUS [LIKE 'pattern']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern']
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
SHOW WARNINGS [LIMIT [offset,] row_count]

如果 SHOW 语法中包括 LIKE 'pattern' 分句的话,'pattern' 是一个可以包括 SQL 语法中‘ % '和‘ _ '等通配符的字符串。这个模式语句对于取得相应的结果十分有用。

请注意,还有以下几种不同的标识方式:

 

    • SET PASSWOR 语句用于设定帐户的密码,详情请看“14.5.1.3 SET PASSWORDSyntax”。
    • SHOW 语句有以下几种方式用于描述复制主服务器和从服务器的信息:

 

  • SHOW BINLOG EVENTS
    SHOW MASTER LOGS
    SHOW MASTER STATUS
    SHOW SLAVE HOSTS
    SHOW SLAVE STATUS

    这些格式的 SHOW 详细描述详情请看“14.6 Replication Statements”。

 

14.5.3.1 SET 语法

SET variable_assignment [, variable_assignment] ...

variable_assignment:
      user_var_name = expr
    | [GLOBAL | SESSION] system_var_name = expr
    | @@[global. | session.]system_var_name = expr

SET 可以设置各种不同的变量类型,这些变量可以影响着服务器或者客户端的参数。它可以帮助你设置用户变量或者是系统变量。
在 MySQL 4.0.3 中,我们增加了 GLOBAL 和 SESSION 选项,并且可以在运行时动态修改系统中最重要的参数。这些可以被动态修改的系统参数详情请看“5.2.3.1 Dynamic System Variables”中会被详细描述到。
在老版本的 MySQL 中,SET 其实是 SET OPTION 的代替,它少了 OPTION 这个参数,不过现在不推荐的使用方法。
以下这个例子演示了几种使用设置变量的方法。

用户变量写成 @var_name,用以下方法来设置:

SET @var_name = expr;

用户变量的特性说明将在章节“10.3 User Variables”中提到。

系统变量在 SET 语法中可以以 var_name 的方式来引用。变量名前面用 GLOBAL 或@@global. 来表示这是一个全局变量,用 SESSION , @@session. 或 @@ 来表示这是一个会话变量。 LOCAL 和 @@local. 其实 SESSION 和 @@session. 属同义。如果变量名前面没有附加的修饰词的话,那么 SET 只修改会话变量。

以 @@var_name这种格式来表示系统变量,在 MySQL 中是可以支持的,以兼容其它数据库系统。

如果你想在同一个语句中来修改多个系统变量,最后一次出现的 GLOBAL 或 SESSION将作为该语句中没有修饰词的变量的默认选项。

SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;

如果你设置了系统变量时用 SESSION (默认的) 选项,那么它的值将在会话结束前或者直到你改变它之前一直有效。如果设置系统变量是用 GLOBAL 选项,这必须要求你具备 SUPER (超级) 权限,它的值从新的连接开始到系统重启前一直有效。如果你想要一个变量永久生效的话,那么可以把它放到配置文件中。详情请看“4.3.2 Using Option Files”。

为了防止操作错误,例如如果你想用 SET GLOBAL 修改一个只能用 SET SESSION 来修改的变量,或者不是用 SET GLOBAL 的方式来修改一个全局变量时, MySQL 就会报告一个错误。

如果你想让一个 SESSION (会话) 变量的值设定成为一个 GLOBAL 变量的值,或者想让 GLOBAL 变量的值变成MySQL内嵌编译的默认值的话,你可以设置它为DEFAULT (默认值) 。以下的这 2 个例子都是同样的设置会话变量max_join_size 的值成为全局变量的值:

SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;

你可以通过 SHOW VARIABLES 命令列出绝大部分的系统变量。详情请看“14.5.3.20SHOW VARIABLES Syntax”的语法 。如果想要通过模式匹配的方式来获取变量列表的话,可以使用 LIKE 分句:

SHOW VARIABLES LIKE 'max_join_size';
SHOW GLOBAL VARIABLES LIKE 'max_join_size';

你还可以使用 SELECT @@[global.|local.]var_name 来取得指定变量的值:

SELECT @@max_join_size, @@global.max_join_size;

在通过 SELECT @@var_name ( 这样的话,就无需指定是 global 还是 session 抑或是 local 了 ) 来取得变量的值时, MySQL 会返回 SESSION 变量的值,如果它不存在,则返回 GLOBAL 变量的值。

以下所列的是那些非标准或者是在章节“5.2.3 Server System Variables”中找没有列出来的变量。尽管这些变量用 SHOW VARIABLES 并不显示出来,但你可以用 SELECT (CHARACTER SET 和 SET NAMES 除外 ) 来取得它们的值。例如:

mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

 

 

AUTOCOMMIT = {0 | 1}
设置 autocommit (自动提交)模式。若设置为 1 ,则所有对数据表的操作都会立即生效。若设置为 0 ,则必须执行 COMMIT 以提交事务或者执行 ROLLBACK取消事务。如果把 AUTOCOMMIT 由 0 改成 1 , MySQL 会自动提交任何一个开放的事务。开始一个事务的另一个方法可以是执行 START TRANSACTION 或BEGIN 语句。详情请看“14.4.1 START TRANSACTIONCOMMIT, andROLLBACK Syntax”。 

BIG_TABLES = {0 | 1}
如果被设置为 1,则所有的临时表将存放在磁盘里而非内存。这会使速度变得稍微慢了点,但是在执行 SELECT 操作时需要一个大临时表的情况下就不再会报告The table tbl_name is full 错误了。对于新连接,它的默认值是 0(在内存中存放临时表) 。从 MySQL 4.0 起,你无需设置这个变量,因为 MySQL 会自动在需要的情况下将内存存储的表转换为硬盘存储的表。这个变量现在的名字是 SQL_BIG_TABLES 。 

CHARACTER SET {charset_name | DEFAULT}
它用于将从客户端取得的以及发往客户端的字符串都映射成指定的字符串。在 MySQL 4.1 以前,唯一允许的字符集是 cp1251_koi8 ,不过你也可以通过修改 MySQL 发布的源代码中的 `sql/convert.cc' 文件来增加新的转换字符集。从 MySQL 4.1.1 开始,SET CHARACTER SET 将设置 3 个会话系统变量:character_set_client 和 character_set_results 会被设置成指定的字符集, character_set_connection 的值被设置成character_set_database 的值。默认的转换字符集可以被重置为值DEFAULT (默认值) 。请注意,SET CHARACTER SET 的语法和其它大多数设置选项的语法不一样。 

FOREIGN_KEY_CHECKS = {0 | 1}
如果它设置为 1 (默认值) ,则 InnoDB 表都会检查外键约束关系。如果设置为0 ,则会略过,不做检查。禁止外键约束关系检查在重新加载和实际所要求的父子关系顺序不一致顺序的 InnoDB 表时非常有用。这个变量是在 MySQL 3.23.52 中新增的。详情请看“16.7.4 FOREIGN KEY Constraints”。
IDENTITY = value
这个变量和变量 LAST_INSERT_ID 实际上是一样的。它的存在是为了与其它数据库系统兼容。从 MySQL 3.23.25 开始,可以通过执行 SELECT @@IDENTITY来获得它的值。从 MySQL 4.0.3 开始,还可以执行 SET IDENTITY 来改变它的值。 

INSERT_ID = value
修改它的值可以作为在执行 INSERT 或 ALTER TABLE 语句中要插入一个AUTO_INCREMENT 值时的下一个值。它主要用于二进制日志(binary log)。 

LAST_INSERT_ID = value
修改它的值可以作为 LAST_INSERT_ID() 的返回值。当数据表被更新时它的值会存放在二进制日志中,可以执行 LAST_INSERT_ID() 语句来取得它的值。设置它的值不会改变 C API 函数 mysql_insert_id() 返回的结果值。 

NAMES {'charset_name' | DEFAULT}
SET NAMES 设置了 3 个会话变量 character_set_client ,character_set_connection 和 character_set_results 为指定的字符集。默认的映射关系可以设定为 DEFAULT。请注意, SET NAMES 语法也不同于大多数其它的设置选项。它是自从 MySQL 4.1.0 以后才开始有的。 

SQL_AUTO_IS_NULL = {0 | 1}
如果被设置为 1 ( 默认值 ) ,则可以通过以下语句来获得某个包含AUTO_INCREMENT 类型字段的表最后一条插入的记录:

WHERE auto_increment_column IS NULL

这种做法在某些 ODBC 程序中会被用到,例如 Access 。 SQL_AUTO_IS_NULL变量是在 MySQL 3.23.52 中新增的。

 

SQL_BIG_SELECTS = {0 | 1}
如果设置为 0 ,则 MySQL 会放弃那些可能会耗费很长时间(是指那些通过优化程序估计到需要检查的行数会超过 max_join_size 设定值的情况)的 SELECT语句。这在有不可取的 WHERE 语句出现时十分有用。 每个新连接的SQL_BIG_SELECTS 默认值为 1 ,以允许执行所有的 SELECT 语句。如果设置系统变量 max_join_size 为非默认值( DEFAULT ),则SQL_BIG_SELECTS 也会被自动设置成为 0。 

SQL_BUFFER_RESULT = {0 | 1}
SQL_BUFFER_RESULT 强制将 SELECT 语句查询的结果放在临时表中。这可以让 MySQL 尽快释放加载表上的锁,同时还有助于改善向客户端发送结果需要较长时间的情况。这个变量是在 MySQL 3.23.13 中新增的。
 

SQL_LOG_BIN = {0 | 1}
如果设置为 0,就不再记录任何二进制日志了。必须要有 SUPER (超级) 权限方可修改它的值。这个变量是在 MySQL 3.23.13 中新增的。 

SQL_LOG_OFF = {0 | 1}
如果设置为 1 ,系统将不记录任何普通的查询日志。必须要有 SUPER (超级) 权限方可修改它的值。 

SQL_LOG_UPDATE = {0 | 1}
如果设置为 0 ,更新日志将不记录任何日志。必须要有 SUPER (超级) 权限方可修改它的值。这个变量是在 MySQL 3.22.5 中新增的。从 MySQL 5.0.0 开始,它已经建议不再使用,而变成了 SQL_LOG_BIN ( 详情请看“C.1.3 Changes in release 5.0.0 (22 Dec 2003: Alpha” ) 。 

SQL_QUOTE_SHOW_CREATE = {0 | 1}
如果设置为 1 ,则在执行 SHOW CREATE TABLE 时就会把数据表名和字段用引号引起来;如果设置为 0 ,就不再引用了。这个选项默认是打开的,因为在数据库同步时需要所有的表名和字段名都必须引用起来才行。这个选项是在 MySQL 3.23.26 中新增的。详细的请查看“14.5.3.6 SHOW CREATE TABLE Syntax”。 

SQL_SAFE_UPDATES = {0 | 1}
如果设置为 1 ,则 MySQL 会放弃那些在 WHERE 或 LIMIT 分句中没有使用键的UPDATE 或 DELETE 语句。这就可能会捕获那些没有正确使用键并且可能会删除很多记录的 UPDATE 或 DELETE 语句。这个变量是在 MySQL 3.22.32 中新增的。 

SQL_SELECT_LIMIT = {value | DEFAULT}
它决定了执行 SELECT 语句时返回的最大记录数。新连接的默认设置值是“ unlimited (无限)”。如果它被改变了,可以设定重新设 SQL_SELECT_LIMIT的值定为 DEFAULT 以将它恢复为默认值。当 SELECT 语句中有 LIMIT 分句时, LIMIT 优先级高于 SQL_SELECT_LIMIT 的值。 

SQL_WARNINGS = {0 | 1}
它决定了在执行单行 INSERT 语句(译者注:一次只有一个 INSERT 语句)发生错误的情况下,是否要报告错误信息。它的默认值是 0 ,如果设置为 1 ,则会在发生错误时报告错误信息。这个变量是在 MySQL 3.22.11 中新增的。 

TIMESTAMP = {timestamp_value | DEFAULT}
它可以设定系统时间。它用于取二进制日志用于恢复记录时来取得原始时间戳。timestamp_value 必须是 Unix 时间戳,而不是 MySQL 时间戳。 

UNIQUE_CHECKS = {0 | 1}
如果设定为 1 (默认值),就会对 InnoDB 表的第二索引做唯一性检查。如果设置为 0 ,就不再做唯一性检查。这个变量是在 MySQL 3.23.52 中新增的。详情请看“16.7.4 FOREIGN KEY Constraints”。

 

14.5.3.2 SHOW CHARACTER SET 语法

SHOW CHARACTER SET [LIKE 'pattern']

SHOW CHARACTER SET 列出了所有可用的字符集。它有一个可选项是 LIKE 分句以示匹配哪些字符集。例如:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | ISO 8859-1 West European    | latin1_swedish_ci |      1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |
| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |
| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |
+---------+-----------------------------+-------------------+--------+

Maxlen 字段显示了储存一个字符使用的最大字节数。

SHOW CHARACTER SET 是在 MySQL 4.1.0 中新增的。

14.5.3.3 SHOW COLLATION 语法

SHOW COLLATION [LIKE 'pattern']

SHOW COLLATION 的结果包括了所有可用的字符集。它有一个可选项是 LIKE 分句以示匹配哪些校对。例如:

mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         |          |       0 |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       0 |
| latin1_danish_ci  | latin1  | 15 |         |          |       0 |
| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
| latin1_bin        | latin1  | 47 |         | Yes      |       0 |
| latin1_general_ci | latin1  | 48 |         |          |       0 |
| latin1_general_cs | latin1  | 49 |         |          |       0 |
| latin1_spanish_ci | latin1  | 94 |         |          |       0 |
+-------------------+---------+----+---------+----------+---------+

Default 字段表示其是否为该字符集的默认校对。Compiled 字段表示该校对是否预编译到服务器中了。Sortlen 字段表示需要多少内存用来对字符集中的字符串表示进行排序。
SHOW COLLATION 是在 MySQL 4.1.0 中新增的。

14.5.3.4 SHOW COLUMNS 语法

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']

SHOW COLUMNS 列出了给定表的所有字段。请注意,如果看到的字段类型和你以前用CREATE TABLE 创建的字段类型不同的话,可能是 MySQL 有时候会在创建或修改表结构时修改字段类型。什么情况下 MySQL 会改变字段类型详情请看“14.2.6.1 Silent Column Specification Changes”。

从 MySQL 3.23.32 开始,就可以使用关键字 FULL 了。它使得输出的结果包括了当前用户对每个字段所具备的权限。从 MySQL 4.1 开始,关键字 FULL 也会令每个字段的注释显示出来。

还可以选择是否使用 db_name.tbl_name 的语法格式。以下的这2个语句是一样的:

mysql> SHOW COLUMNS FROM mytable FROM mydb;
mysql> SHOW COLUMNS FROM mydb.mytable;

SHOW FIELDS 和 SHOW COLUMNS 是一样的。同时还可以通过命令 mysqlshowdb_name tbl_name 来列出所有的字段。

DESCRIBE 语句和 SHOW COLUMNS 显示的结果信息类似。详情请看“14.3.1DESCRIBE Syntax (Get Information About Columns)”。

 

14.5.3.5 SHOW CREATE DATABASE 语法

SHOW CREATE DATABASE db_name

根据给定的数据库显示一个完整的 CREATE DATABASE 语句。它是在 MySQL 4.1 中新增的。

mysql> SHOW CREATE DATABASE test\G
*************************** 1. row ***************************
       Database: test
Create Database: CREATE DATABASE `test`
                 /*!40100 DEFAULT CHARACTER SET latin1 */

 

14.5.3.6 SHOW CREATE TABLE 语法

SHOW CREATE TABLE tbl_name

根据给定的数据表显示一个完整的 CREATE TABLE 语句。它是在 MySQL 3.23.20 中新增的。

mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE t (
  id INT(11) default NULL auto_increment,
  s char(60) default NULL,
  PRIMARY KEY (id)
) TYPE=MyISAM default charset utf8

SHOW CREATE TABLE 根据参数 SQL_QUOTE_SHOW_CREATE 的值来决定是否要把表名和字段名用引号引用起来。详情请看“14.5.3.1 SET Syntax”。

Tagged as: Comments Off
12Dec/13

ssh证书登录方式

Posted by Nick Xu

在/etc/ssh/sshd_config中将以下注释去掉(去掉行首的#号)

 

  1. RSAAuthentication yes
  2. PubkeyAuthentication yes
  3. AuthorizedKeysFile  %h/.ssh/authorized_keys

  4. PasswordAuthentication no

 

加入登录通知机制:

/etc/pam.d/sshd

加入 session optional pam_exec.so seteuid /root/notify.sh

linux下ssh登录限制ip的方法

vi /etc/hosts.allow
sshd:192.168.0.100:allow          //允许IP 192.168.0.100 登录
sshd:192.168.0.:allow            //允许IP 192.168.0.  网段登录
sshd:all:deny                     //禁止其他的所有IP登录
或者
sshd:223.227.223.*:allow              //允许IP 223.227.223.*   网段登录
sshd:192.168.0.*:allow                //允许IP 192.168.0.*  网段登录
sshd:all:deny                                //禁止其他的所有IP登录

fedora下 修改后保存后生效

 

客户端

ssh可以使用密钥对互相建立信任,以后再链接信任的计算机就不需要输入密码了。

1、建立密钥对
niu@niu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/niu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/niu/.ssh/id_rsa.
Your public key has been saved in /home/niu/.ssh/id_rsa.pub.
The key fingerprint is:
27:00:f4:ce:a0:6f:61:a8:55:27:af:9a:bc:2b:d5:21 niu@niu
niu@niu:~$
过程中就一直按回车即可。此时会在 /home/niu/.ssh/ 目录下生成一对文件 id_rsa, id_rsa.pub

2、配置远程计算机
将id_ras.pub文件复制到远程计算机待登录用户个人目录下的.ssh目录中(如不存在自己创建),并将文件名改为 authorized_keys

3、完成

 

 

8Dec/13

Nginx + https + 免费SSL证书配置指南

Posted by Nick Xu

请参考 Nginx Wiki http://wiki.nginx.org/NginxHttpSslModule

生成证书

$ cd /usr/local/nginx/conf
$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

编辑 nginx.conf

server {
server_name YOUR_DOMAINNAME_HERE;
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}

OK, 完成了。但这样证书是不被信任的,自己玩玩还行,要被信任请看下面。

以下内容转载自
http://goo.gl/YOb5
http://goo.gl/Gftj

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容 请看SSL。

它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同 于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广 泛用于万维网上安全敏感的通讯,例如交易支付方面。

1、自行颁发不受浏览器信任的SSL证书:
HTTPS的SSL证书可以自行颁发,Linux下的颁发步骤如下:

openssl genrsa -des3 -out api.bz.key 1024
openssl  req -new -key api.bz.key -out api.bz.csr
openssl rsa -in api.bz.key  -out api.bz_nopass.key

Nginx + https + 免费SSL证书配置指南 7f13bbb85e123811 thumb

nginx.conf 的SSL证书配置,使用 api.bz_nopass.key,在启动Nginx是无需输入SSL证书密码,而使用 api.bz.key 则需要输入密码:

server {
server_name sms.api.bz;
listen  443;
index index.html index.htm index.php;
root  /data0/htdocs/api.bz;
ssl on;
ssl_certificate api.bz.crt;
ssl_certificate_key api.bz_nopass.key;
......
}

自行颁发的SSL证书虽然能够实现加密传输功能,但得不到浏览器的信任,会出现以下提示:
Nginx + https + 免费SSL证书配置指南 6c3f2b38523ed259

2、受浏览器信任的StartSSL免费SSL证书:
跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:StartCom)也是一家CA机构,它的根证书很 久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。

在今年9月 份,StartSSL竟然搞定了微软:微软在升级补丁中,更新了通过Windows根证书认证程序(Windows Root Certificate Program)的厂商清单,并首次将StartCom公司列入了该认证清单,这是微软首次将提供免费数字验证技术的厂商加入根证书认证列表中。现在,在 Windows 7或安装了升级补丁的Windows Vista或Windows XP操作系统中,系统会完全信任由StartCom这类免费数字认证机构认证的数字证书,从而使StartSSL也得到了IE浏览器的支持。

注册成为StartSSL(http://www.startssl.com) 用户,并通过邮件验证后,就可以申请免费的可信任的SSL证书了。步骤比较复杂,就不详细介绍了,申请向导的主要步骤如下:
Nginx + https + 免费SSL证书配置指南 b56b050d03ca03b8 thumb

Nginx + https + 免费SSL证书配置指南 d4477635bf39c593 thumb

Nginx + https + 免费SSL证书配置指南 f4b4b38f6c656990 thumb

startssl在9月微软补丁更新中被支持,使得startssl证书得到承认。

申请流程如下 startssl.com

我的环境是windows 7

请不要使用chrome和IE8,否则将无法生成KEY而无法申请成功。建议使用firefox。

此外我还遇上了点意外,我使用的移动的网络被误判为澳大利亚的IP并收到邮件要求解释。

我将APNIC的查询地址和查询结果发送给对方后帐户才申请成功。

control panel / sign-up 注意填写正确资料。收到邮件后复制验证码。然后可以生成一个证书,注意,startssl.com不是以用户名、密码来验证用户的,是用证书来验证用户 的。

所以生成证书后(火狐会导入证书),注意备份证书。丢失证书后只能重新注册。

登录后还要验证域名才能为该域名生成SSL证书,可以选择在whois里的邮箱、hostmaster@domain、 postmaster@domain或者webmaster@domain

然后就可以在Certificates wizard里就可以申请SSL证书了。

有效期一年。

======2009/11/26 update===========

Toolbox

把你申请时的private key拿去Decrypt private key,然后把生成的key保存起来。

然后在Retieve certificate里选择你申请的域名,就可以得到cer文件,保存起来,放到nginx的conf目录。

在nginx里这样配置

server {
server_name security.meettea.com;
listen  443;
index index.html index.htm index.php;
root  /data0/htdocs/security.meettea.com;
ssl on;
ssl_certificate security.cer;
ssl_certificate_key security.key;
}

nginx -s reload下如果没有任何提示,就说明配置成功了。

可惜firefox3.5测试,不信任class 1的证书。

==============2009/11/26 update===================

在startssl forum看到官方人员说firefox3.5不支持是因为没有配置好。经过配置解决了firefox 3.5不信任该证书的问题,ubuntu studio下测试通过。

步骤是:获取https://www.startssl.com/certs/ca.pem

获取https://www.startssl.com/certs/sub.class1.server.ca.pem

cat ca.pem sub.class1.server.ca.pem >> ca-certs.crt

cat ca-certs.crt >> security.cer

这是因为需要把startssl的根证书和sub class1的证书附上,因为是他们把证书颁发给你,firefox需要这张证书才认识你的证书。 :)

此外opera测试没通过,这点,连startssl.com自己都没有被opera通过。

Incoming search terms:

Tagged as: , , Comments Off
3Dec/13

Ubuntu下使用Pure-ftpd 透過 MySQL管理虛擬FTP用戶帳號

Posted by Nick Xu

應用趨勢
Pure-ftpd是一個很方便管理的FTP伺服器
我們利用它來提供基本的FTP服務是很容易的
在 Ubuntu 下它有幾個安裝類型選擇
(他們間彼此互斥..只能裝一類)

1.原始而單純的用法(和系統的實體帳號有關)
這種用法您只要安裝 pure-ftpd 就好了
sudo apt-get install pure-ftpd

2.配合 MySQL資料庫 作為認證的用法(和系統實體帳號無關)
這種用法您要安裝 pure-ftpd-mysql
sudo apt-get install pure-ftpd-mysql

3.配合 PostgreSQL資料庫 作為認證的用法(和系統實體帳號無關)
這種用法您要安裝 pure-ftpd-postgresql
sudo apt-get install pure-ftpd-postgresql

4.配合 LDAP資料庫 作為認證的用法(和系統實體帳號無關)
這種用法您要安裝 pure-ftpd-ldap
sudo apt-get install pure-ftpd-ldap

其實 proftpd 也有類似的作法..它可以提供的配合類型
還要多2種
proftpd-mod-ldap proftpd-mod-pgsql
proftpd-mod-mysql proftpd-mod-sqlite
proftpd-mod-odbc

OK 瞭解 FTP 伺服器的應用趨勢後
我們再回過神來專注在 我們今天的主題之內
利用 pure-ftpd-mysql 去建立一個具有虛擬帳號管理功能的FTP伺服器

虛擬帳號

先談談虛擬帳號,為何不要用真實帳號
在使用 Linux 主機時,有人要傳送檔案到伺服器上
一般我們會開立一個實體帳號,讓這個使用者使用
而這樣的作法,通常讓這個帳號可以登入到主機內,
而這些帳號,通常也是駭客下手的目標之一
(一般的使用者注重安全的程度通常遠低於系統管理員)

當然的,他也能在上面執行一些程式或作其他的事。
一般Linux主機是難以被攻擊的,但是如果攻擊者
有這樣的權限,可以合法的進到主機內時,他要取得
最高管理員的權限只是時間的問題了。
所以一般的管理員不輕易的將實體帳號開設出去。
因此建立一個只讓虛擬帳號可以上傳下載的 FTP 伺服器
變的更能符合資訊安全的須求。

OK!瞭解了這些背景,我們就向實作的階段出發吧!

實作過程

一、基本設定

1.Ubuntu 下安裝 pure-ftpd-mysql
打開終端機或連線到您的 Ubuntu 主機
輸入下列指令
sudo apt-get install pure-ftpd-mysql
它就會將必要的相關套件一併裝上

2.設定安全性
PS:接下的操作您只要複製英文指令到終端機內執行即可
sudo -i
先變為 root

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone
意思是建立一個ChrootEveryone的檔案內容為yes
就是限制 FTP 登入後的帳號只能在自己的家目錄內活動

echo "no" > /etc/pure-ftpd/conf/PAMAuthentication
不由PAM認證,僅單純的透過MySQL去認證
如果這裡改為"yes",則實體帳號者也能登入。

echo "no" > /etc/pure-ftpd/conf/UnixAuthentication
不由系統認證,僅單純的透過MySQL去認證

echo "yes" > /etc/pure-ftpd/conf/NoAnonymous
不讓匿名用戶登入

echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir
登入後沒有家目錄會自行建立(似乎只能用在實體帳號上)

上述配置後請重新啟動
/usr/bin/service pure-ftpd-mysql restart

上述綠色部分為您要在終端機輸入的指令
到目前為止是沒有任何人可以登入FTP的,
因為我們連資料庫的連線都還沒設定,PureFTP根本還連不到資料庫,
更不用說可以取到資料表的帳號資料去認證了。

二、資料庫設定與配置

資料庫連線的配置檔在/etc/pure-ftpd/db/mysql.conf 內
(檔案內所有前面有#號的行表示是註解)
所以這個檔案雖然內容很多,但其實只有下面幾行才是被使用到的設定:
下面是一個 Ubuntu 系統安裝 pure-ftpd-mysql 後
在/etc/pure-ftpd/db/mysql.conf 內資料庫連線配置檔的預設值。

MYSQLSocket /var/run/mysqld/mysqld.sock
MYSQLUser root
MYSQLPassword rootpw
MYSQLDatabase pureftpd
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM users WHERE User="\L"

以下我們逐行解說其設定內容:
MYSQLSocket /var/run/mysqld/mysqld.sock
這行說明 MySQL 接口的位置,除非您是自行編譯的..否則不須改變它。

MYSQLUser root
這行是指連線到資料庫的帳號,我們可以依照採用root帳號即可。

MYSQLPassword rootpw
這行是指連線到資料庫帳號所用的密碼,您要配合您的資料庫密碼作改變
這是基本用法下..您唯一要變更的地方。

MYSQLDatabase pureftpd
這行是指連線到資料庫後,要使用的資料庫名稱,如果您依本文操作您也不須作改變。

MYSQLCrypt cleartext
這行是指虛擬用戶的密碼,要使用何者編碼方式,如果您依本文操作您也不須作改變。
可用的設定值有下面幾個
cleartext 明碼(不額外編碼) md5 使用MD5編碼加密 crypt 用DES編碼加密
password MySQL的編碼加密
any 指可以視資料庫欄位定義而自動擇用md5、crypt或 password三種編碼方式。

接下4行設定都是資料庫語法。
MYSQLGetPW SELECT Password FROM users WHERE User="\L"
上述表示當虛擬帳號符合User欄位時,選取登入者的密碼欄。

MYSQLGetUID SELECT Uid FROM users WHERE User="\L"
上述表示當虛擬帳號符合User欄位時,選取登入者的使用者ID。
當使用者登入後儲存檔案都會有這種使用者ID、為了安全性起見
您要避免用系統使用的ID。

MYSQLGetGID SELECT Gid FROM users WHERE User="\L"
上述表示當虛擬帳號符合User欄位時,選取登入者的群組ID。

MYSQLGetDir SELECT Dir FROM users WHERE User="\L"
上述表示當虛擬帳號符合User欄位時,選取登入者的家目錄(檔案存取目錄)。
這意味著我們可以在資料表的 Dir 欄位內,任意設定使用者的檔案存取目錄。
好夢幻的功能,真令人激賞。

上述的用法都只用到了"\L",而"\L"表示通過認證後的使用者帳號。
除了"\L"外,pure-ftpd 還提供了 \I、\P、\R、\D 四個符號。
分別表示如下:
\I (目的)虛擬帳號連線的IP
\P (目的)虛擬帳號連線通訊埠(21埠)
\R (來源)虛擬帳號從那個IP連線過來的
\D (來源)虛擬帳號從那個IP連線過來的,同上,但以數位表示。

依上述所言,我們認證的資料庫 pureftpd 內,
須有一個資料表叫users,資料表內
至少須具有五個欄位 User,Password,Uid,Gid,Dir
這樣才能運作起來,下面為整理出的建表語法。

CREATE TABLE `users` (
`User` varchar(16) NOT NULL DEFAULT '',
`Password` varchar(64) NOT NULL DEFAULT '',
`Uid` varchar(11) NOT NULL DEFAULT '-1',
`Gid` varchar(11) NOT NULL DEFAULT '-1',
`Dir` varchar(250) NOT NULL DEFAULT '',
PRIMARY KEY (`User`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

搞清楚這些先前知識後,接著我們要開始來建立資料庫及資料表了

[操作指令]
mysql -u root -p
Enter password: (輸入資料庫root密碼後按確定)

在大於提示符下輸入
CREATE DATABASE pureftpd;[按確定]
USE pureftpd;[按確定]

將建表語法複製貼上後再按確定

回顧這部分我們僅須做3個動作

1.改設定檔內的資料庫密碼
2.登入到資料庫內建立一個pureftpd資料庫
3.建立資料表

這三部分都完成了,您可以重新啟動pureftp伺服器
service pure-ftpd-mysql restart

接著您可以簡便的利用phpMyAdmin去建立帳號
再利用建立的帳號測試登入看看。

If you want to use uid and gid of www-data, it doesn't work. Because by fault in Debian the minimum uid is 1000. You will see the following error.

Client side:

$ ftp example.com
Connected to example.com.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 14:28. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (example.com:haoyu): site.example.com
331 User site.example.com OK. Password required
Password:
530 Sorry, but I can't trust you
Login failed.
Remote system type is UNIX.
Using binary mode to transfer files.
Server side in /var/log/ftp.log:

Sep 17 14:46:25 sd-xxxxx pure-ftpd: (?@defxx-x-xx-xxx-xx-xxx.fbx.proxad.net) [INFO] New connection from defxx-x-xx-xxx-xx-xxx.fbx.proxad.net
Sep 17 14:46:32 sd-xxxxx pure-ftpd: (?@defxx-x-xx-xxx-xx-xxx.fbx.proxad.net) [WARNING] Can't login as [site.example.com]: account disabled
The solution is to modify /etc/pure-ftpd/conf/MinUID value from 1000 to 33. I suggest to disable PAM authentication (system user login) by write “no” in file /etc/pure-ftpd/conf/PAMAuthentication. :!:Don't forget to restart Pure-FTPd server.

[ERROR] Home directory not available - aborting

Even you have put 'yes' in /etc/pure-ftpd/conf/CreateHomeDir, Pure-FTPd will not create the user root directory, and you got ”[ERROR] Home directory not available - aborting” in your syslog. The solution is change the owner to root of the last existing directory in the home path. For example:
The user root directory is /home/ftp/user01 and /home/ftp should own be root

# ls -al /home/
# drwxr-xr-x 4 root ftp 4096 jui 4 21:57 ftp

Tagged as: , , , Comments Off
   
site
site