技术开发 频道

OpenBSD.Nginx.MySQL.PHP环境搭建手册(v2)

  IT168技术文档前言

  本手册是O.N.M.P.系列的第二版,在第一版手册中,只是简单的说明了O.N.M.P.环境的基本搭建方法,并没有过多的考虑到生产系统适用的情况。第二版将作较大的修正,以使得本手册可以对生产环境的搭建起到有益的参考作用。

  本人水平有限,手册中出现纰漏在所难免,您若在生产实际中应用时发现有什么问题,或者有什么更好的建议,请移步至ChinaUnix论坛的BSD版,或至偶的个人博客(http://onmp.cublog.cn),跟帖进行指正。希望在大家的共同努力下,能够把本手册尽量做到完美!

  本手册以在OpenBSD 4.4环境下搭建Nginx、MySQL、PHP环境为例进行讲解。按照惯例,root权限。

  一、OpenBSD的安装及注意事项

  OpenBSD的安装这里就不多说了,主要是安装时系统组件的选择、分区和系统服务的部分。对于系统组件部分,作为生产系统来说,偶并不推荐安装 comp44.tgz这个组件。因为comp44.tgz实际就是编译器,不装这个,可以在很大程度上避免安装一些非授权的软件,从而提高远程主机的安全性。如果真的需要安装什么软件,也可以在非重要的机器上进行编译,然后使用PSFTP等软件上传到远程主机上使用。关于PSFTP软件的使用,二楼有详细 的介绍。

  系统分区时,推荐将/usr、/usr/local、/var、/var/mysql、/var/mail、/var/log、/var/nginx等分 区单独分出来,也就是说,进行比较细致的分区,防止某个目录中的文件膨胀占满整个分区导致的死锁等问题。假定你有一个80G的硬盘,一个分区示例在下面:

  /200M

  (swap)1G

  /tmp200M

  /usr500M

  /usr/local200M

  /var100M

  /var/mysql10G

  /var/mail100M

  /var/log5G~10G

  /home200M

  /var/nginx剩余空间

  至于系统服务部分,建议所有的服务都选择“n”,亦即不随系统启动。

  二、系统性能调优

  对于多核的机器,使用bsd.mp这个核心。

  mv /bsd /obsd

  mv /bsd.mp /bsd

  Ⅰ、/etc/fstab调优

  vi /etc/fstab

  在文件系统描述符部分,加入"noatime"和"softdep"。示例如下:

  /dev/wd0a / ffs rw,noatime,softdep 1 1

  /dev/wd0l /home ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0d /tmp ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0e /usr ffs rw,nodev,noatime,softdep 1 2

  /dev/wd0f /usr/local ffs rw,nodev,noatime,softdep 1 2

  /dev/wd0g /var ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0i /var/log ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0j /var/mail ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0h /var/mysql ffs rw,nodev,nosuid,noatime,softdep 1 2

  /dev/wd0k /var/nginx ffs rw,nodev,nosuid,noatime,softdep 1 2

  友情提醒:softdep是一种非同步的文件系统,意外掉电可能造成数据的遗失/损坏,生产系统请谨慎使用!

  改完后保存退出,reboot,看能不能正常启动。

  一般情况下是没有问题的,个别机器或虚拟机可能会因为兼容性的缘故,无法启动。那么就把根目录的softdep拿掉,其他目录保留,仍然会有作用。

  更多关于OpenBSD环境下磁盘性能调优的内容,请参看偶博客的文章,地址在下面:

  http://blog.chinaunix.net/u2/81136/showart_1841280.html

  Ⅱ、/etc/sysctl.conf调优

  vi /etc/sysctl.conf

  跳到最后,加入下面的内容:

  # 增大文件系统缓存到1M

  kern.maxvnodes=131072

  # 允许最多65536个进程

  kern.maxproc=65536

  # 同时最多打开65536个文件

  kern.maxfiles=65536

  # 并发连接最大65536

  kern.somaxconn=65536

  # 保留的最少连接数

  kern.sominconn=256

  kern.maxclusters=32768

  # 增大TCP接收/发送缓存到64K

  net.inet.tcp.recvspace=65536

  net.inet.tcp.sendspace=65536

  # 增大UDP接收/发送缓存到64K

  net.inet.udp.recvspace=65536

  net.inet.udp.sendspace=65536

  注意:虚拟机测试只加最上面一行kern.maxvnodes=65536即可,其他的不必加了,否则会有各种问题。独立机器的可以加上。

  保存退出,reboot。不能正常启动的就把除kern.maxvnodes以外的数字调小或者禁用再试。

  三、OpenBSD.Nginx.MySQL.PHP软件环境的安装

  OpenBSD环境下软件的安装是非常简单的,因为在官方的ftp中提供了已经编译好的二进制包,需要安装的软件都在ftp中,从ftp中安装即可。

  小提示:如果你机器比较多,你可以把需要安装的软件包都down回来,其他机器再来这里安装,速度会非常快!

  export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/

  pkg_add mysql-server php5-fastcgi php5-gd-5.2.6-no_x11 phpMyAdmin lighttpd-1.4.19p3 nginx pecl-APC

  以 偶的1M ADSL小水管为例,大约也就二十分钟左右就安装完毕了!真的是非常快!和其他系统的wget源码、./configure && make && make install...所需要的时间相比,效率是非常高!而且,由于OpenBSD默认采用比较高的安全策略,装上的环境安全性也比其他系统要高!

  等所需的软件都安装完成后,按提示作链接并创建PHP临时工作目录:

  ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules

  ln -fs /var/www/conf/php5.sample/apc.ini /var/www/conf/php5/apc.ini

  ln -fs /var/www/conf/php5.sample/gd.ini /var/www/conf/php5/gd.ini

  ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini

  ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini

  ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini

  mkdir /var/nginx/sesstmp

  chmod 0777 /var/nginx/sesstmp

  pkg_info检查一下系统中安装了些什么软件包:

  可以看到,所需的软件包和依赖的包都安装好了!

  四、Nginx配置

  Ⅰ、Nginx配置文件的修改

  修改nginx的默认配置文件:

  vi /etc/nginx/nginx.conf

  按下面的内容修改Nginx的配置文件。兰色表示需要手动修改的内容,红色表示增加的内容:

  #user nobody;

  # 指定子进程数,酌情修改

  worker_processes 2;

  #error_log logs/error.log;

  #error_log logs/error.log notice;

  #error_log logs/error.log info;

  #pid logs/nginx.pid;

  # 最多可打开文件数

  worker_rlimit_nofile 8196;

  events {

  # 最大并发数

  worker_connections 1024;

  }

  http {

  include mime.types;

  default_type application/octet-stream;

  # 关掉错误日志

  error_log /dev/null crit;

  # 如果需要错误日志,就用下面这行替换上面这行

  #error_log /var/log/nginx/error.log notice;

  # 定义日志格式,对日志使用缓存,避免频繁的磁盘I/O操作

  access_log /var/log/nginx/access.log combined buffer=1m;

  sendfile on;

  tcp_nopush on;

  tcp_nodelay on;

  keepalive_timeout 10;

  # 对静态文件和可压缩文件启用压缩,以节约网络带宽,提高访问速度

  gzip on;

  gzip_min_length 1k;

  gzip_buffers 4 8k;

  gzip_http_version 1.1;

  gzip_comp_level 3;

  gzip_types text/html text/css text/xml text/plain application/x-javascript application/xml application/pdf application/x-perl application/x-tcl application/msword application/rtf application/vnd.ms-excel application/vnd.ms-powerpoint application/vnd.wap.xhtml+xml image/x-ms-bmp;

  gzip_disable "MSIE [1-6] \.";

  gzip_vary on;

  # 定义输出缓存大小

  output_buffers 4 32k;

  # 最大允许可上传文件大小

  client_max_body_size 20m;

  # 定义一个叫“myzone”的记录区,总容量为 10M

  # 和下面的limit_conn一起限制单个IP的并发连接数为10

  limit_zone myzone $binary_remote_addr 10m;

  server {

  listen 80;

  server_name localhost;

  location / {

  root /var/nginx/html;

  index index.php index.html index.htm;

  limit_conn myzone 10;

  }

  error_page 500 502 503 504 /50x.html;

  location = /50x.html {

  root /var/nginx/html;

  }

  location ~ \.php$ {

  root html;

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  fastcgi_param SCRIPT_FILENAME /var/nginx/html$fastcgi_script_name;

  include fastcgi_params;

  }

  # 在浏览器本地暂存图片和静态文件,不记录日志,以节约机器资源

  location ~* \.(gif|png|jpg|jpeg|bmp|css|js|swf)$

  {

  root /var/nginx/html;

  access_log off;

  expires max;

  }

  # 在浏览器中输入http://xxx.xxx.xxx/status可以看到Nginx的运行信息

  # 需要密码认证,不记录日志,限制IP访问

  location ~ /status

  {

  auth_basic "O.N.M.P.";

  auth_basic_user_file password;

  stub_status on;

  access_log off;

  allow 192.168.0.0/24;

  deny all;

  }

  }

  }

  其他的部分请酌情修改。

  运行下面的命令生成查看Nginx运行状态的密码文件:

  htpasswd -c /etc/nginx/password webadmin

  按提示输入两遍密码即可。

  在查看status的时候,输入用户名webadmin(见上面这行)和密码就能够看到Nginx的运行数据了。

  Nginx能够流行和它的高负载能力是分不开的,在追求性能表现的场合,推荐使用Nginx+PHP-fastcgi的组合以获得强健的性能表现。而对于 那些重视安全性的场合来说,可能OpenBSD内核集成的Apache更合适。OpenBSD下搭建Apache、MySQL、PHP环境的详细内容请参见偶的另篇博文,地址在下面:

  http://blog.chinaunix.net/u2/81136/showart_1860332.html

  当然,你也可以利用Nginx内置的负载均衡功能,在前端分配访问流量,后端由Apache来运行PHP环境。Nginx负载均衡的配置可以去Nginx的主页参看相关内容,地址:http://wiki.nginx.org/Main。

  下面为一个Nginx负载均衡的示例:

  http {

  upstream myproject {

  ip_hash;

  server 192.168.1.1:80;

  server 192.168.1.2:80;

  server 192.168.1.3:80;

  server 192.168.1.4:80;

  }

  server {

  listen 80;

  server_name www.domain.com;

  location / {

  proxy_pass http://myproject;

  }

  }

  }

  网络拓扑示意图如下:

  Ⅱ、Nginx日志截断

  OpenBSD默认每天00:00会执行/etc/daily.local脚本中的内容,我们只需要把Nginx日志截断的命令加入到这个文件中即可。

  vi /etc/daily.local

  加入下面的内容:

  #!/bin/sh

  # 对Nginx日志进行截断和压缩,以节约log分区空间

  # 在张宴的基础上修改,感谢!

  mkdir -p /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/

  mv /var/log/nginx/access.log /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log

  kill -USR1 `cat /var/run/nginx.pid`

  sleep 1

  gzip /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log

  保存退出,为/etc/daily.local加上执行权限:

  chmod 0755 /etc/daily.local

  其他需要每天运行的命令也都可以加在这个脚本里面,各位自行处理。

  五、MySQL与phpMyAdmin的配置

  Ⅰ、MySQL的配置

  安全起见,MySQL需要运行在自己的daemon下:

  vi /etc/login.conf

  跳到最后,加入MySQL所需的修改:

  mysql:\

  :openfiles-cur=2048:\

  :openfiles-max=4096:\

  :tc=daemon:

  使修改生效:

  cap_mkdb /etc/login.conf

  初始化MySQL数据库:

  /usr/local/bin/mysql_install_db

  MySQL自带了几个配置文件,在/usr/local/share/mysql目录中,可以拷贝为/etc/my.cnf使用。关于MySQL的配置和优化等内容,可以自行Google,这里不再赘述。

  MySQL安全须知

  1、不要用root身份运行数据库或PHP应用。并且,最好是数据库名和数据库用户名不同,以提高安全性。

  例如,域名为example.net,则数据库名设为abcxyz,数据库用户名设为xyzabc。总之,关联度越低越好,数据库名和数据库用户名越复杂越难猜测越好。

  2、控制权限的分配,PHP应用仅给予必要的权限。

  例如,安装/升级Discuz!和PHPWind论坛程序,仅需要下图所示的权限即可:

  在安装/升级完毕后,还可以把CREATE、ALTER、DROP权限去掉,不会影响论坛程序的运行,而且提高了安全性!

  Ⅱ、PHP MyAdmin的配置

  由于OpenBSD中的phpMyAdmin默认是安装在/var/www/phpMyAdmin目录中的,直接使用Nginx是无法访问的,我们需要把它拷贝到Nginx目录下,这样就可以通过浏览器来管理MySQL数据库了。

  mkdir /var/nginx/html/pma/

  cp -rf /var/www/phpMyAdmin/* /var/nginx/html/pma/

  修改phpMyAdmin的配置文件,使之可用。

  vi +17 /var/nginx/html/pma/config.inc.php

  将下面这行修改成:

  $cfg['blowfish_secret'] = 'a'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH!*/

  (仅是加入了字母a而已)

  保存退出。

  小提示:

  1、上面新建了/var/nginx/html/pma目录来保存phpMyAdmin的文件,目录名很简单。你可以用一个更复杂的目录名来代替,例如:pma2YAY5jRpfFfLXQVm这样的目录名,以防止黑客利用字典攻击等方法渗透你的phpMyAdmin!

  2、你还可以在Nginx的配置文件中,将/var/nginx/html/pma配置成某个虚拟主机的根目录,并限定可以访问这个虚拟主机的IP。这样,就可以在很大程度上提高数据库的安全性了!一个配置示例在下面:

  location / {

  allow 192.168.0.0/24;

  deny all;

  }

  3、假如平时只是偶尔用到phpMyAdmin,你还可以在用完后删除/var/nginx/html/pma目录,需要用的时候再拷贝过去。

  4、你还可以将以上方法结合起来灵活使用,既建立一个无法被猜测的目录名,又限制IP访问,这样你的系统被黑的机会就会小了很多!

  六、强化PHP的安全

  OpenBSD软件包中的PHP已经自带了suhosin这个补丁,可以在很大程度上提高PHP脚本的安全。本节主要讨论在php.ini文件中进行相关的设置,进一步提升安全性。具体来说,就是禁用某些危险函数和启用PHP安全模式。

  偶一般是把对PHP的所有修改都放在一个单独的文件中进行,包括对PHP参数以及扩展模块的修改,都放在这个文件中一并处理,这样查找、修改和管理会方便许多:

  vi /var/www/conf/php5/addphp.ini

  加入下面的内容:

  ; 禁止动态加载模块

  enable_dl = Off

  ; 隐藏PHP信息

  expose_php = Off

  ; 限定可访问目录

  open_basedir = /var/nginx/html/

  ;设定session暂存目录

  session.save_path=/var/nginx/sesstmp

  ; 设定PHP上传文件的临时目录

  upload_tmp_dir=/var/nginx/tmp

  ; 禁用危险函数(注意下面的内容应该是一行,编排的原因分成了多行)

  disable_functions = phpinfo,com,shell,exec,system,passthru,error_log,

  stream_socket_server,putenv,ini_alter,ini_restore,ini_set,dl,openlog,

  syslog,readlink,symlink,link,leak,fsockopen,pfsockopen,proc_open,

  popepassthru,escapeshellcmd,escapeshellarg,chroot,scandir,chgrp,chown,

  shell_exec,proc_get_status,popen,shmop_close,shmop_delete,shmop_open,

  shmop_read,shmop_size,shmop_write

  ; 启用PHP的安全模式

  ; PHP在安全模式下运行是用性能换安全。据简单测试,性能下降到50%左右,各位请酌情使用

  ; 启用安全模式后,某些程序可能受到影响。例如,Discuz!将无法上传附件

  safe_mode = On

  ; pecl-APC只使用16M的共享内存用以加速PHP程序的运行

  apc.shm_size=16M

  保存退出。

  七、强化SSH的安全

  Ⅰ、SSH配置文件的修改

  vi /etc/ssh/sshd_config

  跳到最后,加入下面的部分:

  # 使用高位端口,防止黑客扫描22端口。可选范围1024~65535,推荐32768~65535。

  Port 58937

  # 登录时间控制在30秒内

  LoginGraceTime 30

  # 不允许root远程直接登录

  PermitRootLogin no

  StrictModes yes

  # 最多允许三次错误

  MaxAuthTries 3

  # 最多允许三个SSH线程

  MaxSessions 3

  # 使用SSH协议2

  Protocol 2

  # 不使用密码认证

  PasswordAuthentication no

  # 使用KEY的方式认证

  PubkeyAuthentication yes

  # KEY文件存放位置

  AuthorizedKeysFile .ssh/authorized_keys

  Ⅱ、使用KEY进行验证

  关于使用PuTTY进行KEY验证的方法,请参见偶的另一篇博文,地址:

  http://blog.chinaunix.net/u2/81136/showart_1860332.html

  Ⅲ、按需启动SSH

  我们只在必要的时候启动sshd服务,用完即停止,不给黑客扫描的机会。输入下面的命令:

  crontab -e

  跳到最后,输入下面的内容(中间的空白部分为Tab):

  # 每天的10:30启动sshd服务

  30 10 * * * /usr/sbin/sshd

  # 10:35即停止sshd服务,也就是说,你只有五分钟的时间可以登录进系统

  35 10 * * * kill `cat /var/run/sshd.pid`

  保存退出。

  上面的时间请酌情修改。sshd服务启动的时间尽量不要太长,5~10分钟应该够了!

  Ⅳ、一点安全小常识

  1、私钥请一定保存在安全的地方,不要保存在本地计算机上,并加上足够强度的“保护码”;

  2、本地计算机不要保存远程主机的“指纹”,用一次确认一次(远程主机的指纹保存在注册表的HKEY_CURRENT_USER\Software\SimonTatham\PuTTY项下,可以手动删除);

  3、不要使用DSA密钥,据说有漏洞的;

  4、不要在公用计算机上连接远程主机,有键盘记录器、木马什么的就麻烦了;

  5、多个远程主机不要使用相同的公钥,最好是使用各自的公钥、私钥;

  6、少用,最好是不用无线网络,加密强度太差,容易被破解;

  7、M$系统下的病毒、木马太多了,推荐客户端转换到Linux/UNIX环境,安全性更高,而且仍然有PuTTY及工具可用;

  8、注意清除本地机器上不必要保留的文件(例如私钥、公钥、主机RSA指纹、C:\Documents and Settings\Administrator目录下的文件等等)。

  八、启用Packet Filter防火墙

  Packet Filter是非常优秀的包过滤防火墙,OpenBSD核心已经集成了Packet Filter防火墙,不过默认并没有启用,下面我们来启用Packet Filter的强大功能!

  vi /etc/pf.conf

  跳到最后,加入下面的内容:

  # 宏定义

  # 请把下面的fxp0换成你自己用的外网网卡,不知道的可以输入ipconfig查看

  ext_if="fxp0"

  # 指定可以使用SSH登录的IP,支持CIDR

  admin_add="192.168.0.0/24"

  # 指定SSH端口。

  # 注意,如果在/etc/ssh/sshd_config文件中更改了SSH端口号,这里的也需要同样修改。否则连不上了不要怪偶没有提醒!

  ssh_port="58937"

  # 维持一个持久的表,里面存放的是对本机发动DDoS攻击的IP

  table persist

  # 选项设定

  set require-order yes

  set block-policy drop

  set optimization aggressive

  set loginterface none

  set skip on lo0

  # TCP参数设定

  set timeout {interval 3,frag 10}

  set timeout {tcp.first 10,tcp.opening 2,tcp.established 600,tcp.closing 20,tcp.finwait 10,tcp.closed 10}

  # UDP、ICMP及其它参数设定

  set timeout {udp.first 20,udp.single 10,udp.multiple 10}

  set timeout {icmp.first 10,icmp.error 5}

  set timeout {other.first 20,other.single 10,other.multiple 20}

  set timeout {adaptive.start 0,adaptive.end 0}

  # 允许最多有65536个连接

  set limit { states 65535, frags 200, src-nodes 65536, tables 65536, table-entries 1048576 }

  # 包整形

  scrub in all

  scrub out all

  # 阻止所有不匹配的包和从DDoS主机来的包

  block quick from

  block return

  block in all

  block out all

  # 防止IP欺骗

  antispoof quick for {lo0,$ext_if}

  # 允许本机访问其他机器

  pass out quick on $ext_if inet from $ext_if to any flags S/SA keep state

  # 允许IPv4地址的客户机访问本地80(www)端口,发起过快连接(DDoS)的主机加入阻止列表。注意是一行,下同

  pass in quick on $ext_if inet proto tcp from any to $ext_if port 80 flags S/SA synproxy state (source-track rule,max-src-nodes 200,max-src-states 100,max-src-conn 100,max-src-conn-rate 1000/10,overload flush global )

  # 允许IPv6地址的客户机访问本地80(www)端口,发起过快连接(DDoS)的主机加入阻止列表

  pass in quick on $ext_if inet6 proto tcp from any to $ext_if port 80 flags S/SA synproxy state (source-track rule,max-src-nodes 200,max-src-states 100,max-src-conn 100,max-src-conn-rate 1000/10,overload flush global )

  # 允许管理IP远程连接本机SSH端口

  pass in quick on $ext_if inet proto tcp from $admin_add to $ext_if port $ssh_port flags S/SA synproxy state

  保存退出。

  修改系统配置,使得开机启用PF防火墙:

  vi /etc/rc.conf.local

  跳到最后,加入下面这行:

  pf=YES

  保存退出。

  九、系统启动脚本的修改

  修改系统启动脚本,使得MySQL、PHP(fastcgi)、Nginx可以在系统启动的时候自动启动,免去手动启动的麻烦。

  vi /etc/rc.local

  跳到最后,加入下面的内容:

  # 启动时校时。这行也可以加在/etc/daily.local文件的最前面,每天零点自动校时

  rdate -n 210.72.145.44

  # Start MySQL

  if [ -x /usr/local/bin/mysqld_safe ] ; then

  echo -n 'Starting MySQL...'

  su -c mysql root -c '/usr/local/bin/mysqld_safe >/dev/null 2>&1 &'

  echo "DONE"

  fi

  # Start php-fastcgi

  if [ -x /usr/local/bin/spawn-fcgi ] ; then

  echo -n 'Starting php-fastcgi...'

  /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www -f /usr/local/bin/php-fastcgi > /var/run/fcgi.pid

  echo "DONE"

  fi

  # Start nginx

  if [ -x /usr/local/sbin/nginx ] ; then

  echo -n 'Starting nginx...'

  /usr/local/sbin/nginx

  echo "DONE"

  fi

  保存退出。

  reboot重启,启动后输入top看看,O.N.M.P.环境已经搭建好了!

  系统启动后,还要把MySQL自带的测试数据库和匿名用户删除,防止被黑客利用。

  默认情况下,新安装的MySQL数据库,root密码为空!同样需要第一时间进行设置,方法见下图:

  好了,至此,O.N.M.P.环境的搭建已经结束,剩下的就看各位自行发挥了!

  写在最后

  其实,系统的安全是个整体工程,并不是用上了OpenBSD这个最安全的操作系统就算万事OK,还有很多事情要做。

  更多的是需要在日常工作中积累经验,多分析系统整体的运行情况,多关注网络安全方面的内容,这样才能尽可能的打造安全的运维环境。

  本手册只是起到抛砖引玉的作用,希望能吸引更多的人来关注系统安全,希望有更多的人能用上OpenBSD这个主动安全的操作系统,希望能推动OpenBSD在国内的更多普及。如此,则幸甚!

0
相关文章