[计算机组成原理-001]计算机的分类&发展趋势&发展历程

计算机的分类

以实现方式和应用领域分类

从实现方式的角度划分,电子计算机可以划分成模拟计算机和数字计算机,如图 1:

图 1

电子计算机处理的是一些连续的电信号,数字计算机处理的是一些离散的电信号 (如 0 或 1). 模拟计算机容易被干扰,但是由于模拟计算机可以处理的数据量更大(因为可以处理的信号更多),因此,虽然模拟计算机对运行环境的要求比较高,但是,在科学研究领域仍然有应用。

数字计算机又分为专用的和通用的两大类。专用的数字计算机有游戏主机,军工计算机,而通用计算机中最常见的就是我们平时常用的个人电脑(个人电脑属于微型机)。

以指令流和数据流的处理方式分类

以指令流和数据流的处理方式进行分类其实就是费林分类法。费林分类法认为,计算机中的资讯流可以分为指令流和数据流两种,根据指令流和数据流的数量可以对计算机进行分类。

费林分类法将计算机分为了以下四种类型:

  • 单指令流单数据流计算机 (SISD);
  • 单指令流多数据流计算机 (SIMD);
  • 多指令流单数据流计算机 (MISD);
  • 多指令流多数据流计算机 (MIMD).

以下是对上述四种类型的计算机的解释。

1.单指令流单数据流

英文全称为:Single Instruction, Single Data, 英文缩写:SISD.

在 SISD 计算机中,每个指令部件每次仅译码一条指令,而且在执行时仅为操作部件提供给一份数据。单指令流单数据流的一个典型应用就是冯·诺伊曼结构。

图 2. 冯·诺伊曼结构,CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1393357

2.单指令流多数据流

英文全称:Single Instruction, Multiple Data, 英文缩写:SIMD.

在 SIMD 计算机中采用一个控制器控制多个处理器,实现了对同一组数据(亦称为”数据向量“)中的每一个分别执行相同的操作,从而达到空间上的并行性(同一组数据中的不同部分在不同的处理单元上完成计算)。SIMD 的应用有阵列处理器和向量处理器等。

克雷 YMP 向量计算机的处理器板:

图 3. 由Hannes Grobe & Chresten Wübber, Alfred Wegener Institute for Polar and Marine Research, Bremerhaven, Germany – 自己的作品,CC BY-SA 2.5,https://commons.wikimedia.org/w/index.php?curid=1135061

3.多指令流单数据流

英文全称:Multiple Instruction, Single Data, 英文缩写:MISD.

多指令流单数据流计算机的存在是没有意义的。一般情况下,一条指令中即包含对多个数据流的操作,多指令流中将包含对更多数据流的操作,如果这时候只有一条数据流,那么完全是“吃力不讨好”,因为更多的指令流并没有带来更大的效率提升。

4.多指令流多数据流

英文全称:Multiple Instruction, Multiple Data, 英文缩写:MIMD.

在 MIMD 计算机中,多个独立的处理单元可以单独的连接到内存,可以进行并行计算。MIMD 计算机的应用主要有多处理器组成的单个计算机或者多计算机组成的集群。

MIMD 工作示意图:

图 4. 图中的”PU”指的是处理单元,但是”PU”不一定必须是处理器,可以只是能完成处理功能的单元。该图展示了指令、数据和对数据的处理之间的关系。由I, Cburnett,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=2233543

计算机的发展趋势

计算机目前有两种发展趋势,一方面是小型化,便携化,满足个人用户的需要,例如手机和各种可穿戴设备。另一方面,计算机还向着高性能的方向发展,例如超级计算机。

图 5 是美国高峰(也有译作“顶点”,英文名称:Summit)超级计算机的一部分机组(2018 年 06 月 25 日,Summit 正式获得 TOP500 认证为全球运行速度最快的超级计算机):

图 5. 由Carlos Jones/ORNL – https://www.flickr.com/photos/olcf/42957291821/in/photolist-NsW4ML-25mPCpZ-JkN2vk-28rZmfr-YYYjk1-282ZTzq-271XTpf-271XZao-26JSfsB-25mPBPa-287nqxR-FENxmy-22HVvNY-227b4AU-XgBEPE-W6iPRi-XZZrnP-28rxs9o-XqcFKR-28rZmpK-H4EmiH-27ZDEwH-26JSngB-279g4ti-25moRES-28vVuuM,CC BY 2.0,https://commons.wikimedia.org/w/index.php?curid=73905694

计算机的发展历程

硬件

从 1946 年 02 月 14 日,世界上第一台电子计算机 ENIAC 在美国宾夕法尼亚大学诞生至今,计算机硬件的发展历程可以分为四个时代,如 表 1:

发展阶段时间逻辑元件运行速度(次/秒)内存介质外存介质
第 1 代1946-1957电子管(真空管)几千-几万汞延迟线,磁鼓打孔卡片
第 2 代1958-1964晶体管几万-几十万磁芯存储器磁带
第 3 代1964-1971中小规模集成电路几十万-几百万半导体存储器磁带,磁盘
第 4 代1972-Now大规模与超大规模集成电路千万级-亿万级半导体存储器磁盘,磁带,光盘,半导体存储器

表 1

电子管(也称之为“真空管”)的缺点是体积大,容易坏掉。

图 6. 常用的 6922 双三极真空管,公有领域, https://commons.wikimedia.org/w/index.php?curid=3152281

晶体管的体积比电子管小了很多,稳定性上也有很大的提升:

图 7. 由英语维基百科的Transisto – 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=11885148

微型计算机的发展是以微处理器 (CPU) 的发展为标志的。微处理器性能的一个重要指标是机器字长。机器字长指的是做一次整数运算所能处理的二进制数位数。例如,我们今天常说的 64 位处理器和 32 位处理器,他们做一次整数运算所能处理的二进制数的位数就分别是 64 位和 32 位。在此之前,还出现过 8 位机器字长和 16 位机器字长的微处理器。

这里我们要把机器字长和操作系统的位数区分开,因为操作系统的位数是由其所依赖的指令集的位数决定的,操作系统的位数影响的是整个系统能够访问的存储空间的大小。机器字长和操作系统的位数是两个不同的概念,这一点从他们各自的发展就可以看出来,X 位 CPU 和 X 位操作系统的出现与发展并不是同步的。

在计算机硬件的发展过程中,有一个定律不可忽视,这就是摩尔定律。摩尔定律是由 Intel 创始人之一戈登·摩尔(Gordon Moore)提出的。摩尔定律描述了计算机硬件(信息技术)进步的速度。摩尔定律描述如下:

当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。

图 8. 由 Wgsimon – 自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=15193542

软件

编程语言:机器语言⇨汇编语言⇨高级语言 (如 C++, Java 等)。

操作系统:DOS, Unix, Linux, Windows, Android.

EOF

CentOS 7 中 Apache 服务器禁止目录浏览

操作环境

服务器操作系统:CentOS 7
Web 中间件:Apache 2

问题说明

今天对网站进行安全检查的时候,发现了一个名为 “Index of /wordpress” 的网页。打开一看,竟然可以进行目录浏览

图 1

这是一个很危险的漏洞,几乎把荒原之梦的所有网站文件的名称都公开显示了。

解决步骤

修改相关目录的权限:

chmod 755 -R wordpress/

修改 Apache 的配置文件,进入如下目录:

/etc/httpd/conf

修改配置文件

vim httpd.conf

找到 Options Indexes FollowSymLinks, 将其注释掉并修改为:

Options None

保存并退出后,重启 Apache 服务器:

systemctl restart httpd

之后,刷新具有目录浏览问题的页面可以发现,已经无法进行目录浏览:

图 2

EOF

Linux 安全加固:在 CentOS 上修改 SSH Server 的默认监听端口 (Linux Security Reinforcement: Modify the Default Listening Port for SSH Server on CentOS)

操作说明

22 号端口是 SSH Server 的默认监听端口,当有人对我们位于公网上的服务器进行端口扫描的时候,极有可能发现这个端口并尝试恶意登陆我们服务器上的 SSH Server, 因此修改这个默认监听端口就很有必要。

操作环境

本文中我的操作是在一台远程 VPS 上进行的(我无法连接该 VPS 的本地 Shell, 因此,在接下来的操作中我始终要确保能够远程登陆这台 VPS.), 其操作系统版本信息如下:

[root@GreedyIronclad-VM ~]# cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m

操作步骤

打开 SSH Server 的配置文件:

vim /etc/ssh/sshd_config

可以找到如下内容:

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

去掉 “Port 22”[1] 前面的注释并在其下添加 “Port XXX”[2], 例如:

Port 22
Port XXX
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Restart SSH Server:

[root@GreedyIronclad-VM ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

之后我们还需要对防火墙做一些设置,这样才能确保新增的监听端口 XXX[2] 不被防火墙阻断。
在这里,有些文章可能建议大家直接关闭防火墙,我建议大家千万不要这么做。直接关闭防火墙确实可以省下很多麻烦,但是我们修改 SSH Server 的默认端口的目的就是为了增强服务器的安全性,如果为此而关闭了防火墙那岂不是得不偿失。

具体操作如下:

编辑防火墙配置文件:

vim /etc/sysconfig/iptables

将用于 SSH Server 的 “XXX”[2] 端口加入允许规则:

-A INPUT -m state --state NEW -m tcp -p tcp --dport XXX -j ACCEPT

命令参数注释:

-A: 附加该规则到已有规则的末尾;
INPUT: 入站规则;
-m: 显示扩展;
-m state: 使用 state 扩展模块。当连接与跟踪结合使用时,state 模块允许访问数据包的连接跟踪状态;
-m state –state NEW: 连接中的第一个数据包;
-m tcp: 使用 TCP 扩展模块;
-p tcp: 指定待检查包的协议为 TCP 协议;
–dport XXX: 指定目的端口为 XXX;
-j ACCEPT: 如果数据包和该规则匹配则接受该数据包。

重启防火墙以使配置生效:

service iptables restart

之后,使用新增的非默认端口尝试连接远程服务器,如果可以连接成功(正常情况下,此时使用 22 号端口以及新增的非默认端口都可以连接远程服务器),则接下来我们就把原来的 22 端口禁用掉。

在 SSH Server 的配置文件中注释掉对 22 号端口的监听,编辑配置文件:

vim /etc/ssh/sshd_config

修改后如下:

#Port 22
Port XXX
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Restart SSH Server:

service sshd restart

此时,再次尝试连接 SSH Server 的 22 号端口应该就已经会被拒绝连接。但是为了更加安全,我们还需要在防火墙上拒绝入站请求 22 端口的连接。

在防火墙上禁止来自 22 端口的连接请求,编辑防火墙配置文件:

vim /etc/sysconfig/iptables

修改示例如下:

#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j DROP

Restart Iptables:

service iptables restart

注释

[1] 这一步不能去掉对原来的 22 号端口的监听,因为我们在修改配置文件时使用的还是 22 端口,一旦 22 端口失效而新增的监听端口没能正常工作,那么我们就失去了和远程服务器的连接。
[2] “XXX” 为你想要设置的 SSH Server 监听的端口号,建议应大于 10000, 因为如果攻击者从小到大依次扫描各个端口号,那么大于 10000 的端口被扫描到的可能性将大大降低。

解决 CentOS 7 报错: /var/run/yum.pid 已被锁定

报错描述

今天在使 yum 命令安装软件的时候遇到了如下报错:

/var/run/yum.pid 已被锁定,PID 为 3355 的另一个程序正在运行。
Another app is currently holding the yum lock; waiting for it to exit...
  另一个应用程序是:PackageKit
    内存:155 M RSS (717 MB VSZ)
    已启动: Sun Apr 28 15:01:12 2019 - 04:40之前
    状态  :运行中,进程ID:3355

报错截图如下:

图 1
图 1

解决方案

运行下面的命令, 强制结束 yum 进程即可:

rm -f /var/run/yum.pid

另外, 如果担心强制删除系统文件会引发难以预测的错误, 也可以尝试稍等一会(经过实测发现, 稍微等待一段时间后上述报错可能会自行消失)或者选择重启系统.

解决 CentOS 7 报错: “Repository base is listed more than once in the configuration”和”没有可用软件包 XXX”的问题

报错描述

我的 CentOS 7 的更新源使用的是直接从 163 镜像站上下载的更新源文件.

今天在使用 yum makecache 命令从更新服务器上把软件包的信息下载到本地缓存起来时遇到了如下报错:

Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration

报错截图如下:

图 1
图 1

而且在我使用 yum install htop 命令安装 htop 的时候, 还提示:

没有可用软件包 htop。
错误:无须任何处理

但是, 正常情况下 CentOS 7 的源里面应该是有 htop 这个软件包的, 可以直接使用 yum install htop 成功安装(我之前安装过).

上述问题的相关截图如下:

图 2

解决方案

分析上面的报错, 主要还是软件源文件出了问题, 于是我们先进入软件源配置文件所在的目录下:

cd /etc/yum.repos.d/

ls 查看一下, 回显如下:

[root@localhost yum.repos.d]# ls
CentOS7-Base-163.repo    CentOS-CR.repo         CentOS-Media.repo
CentOS-Base.repo         CentOS-Debuginfo.repo  CentOS-Sources.repo
CentOS-Base.repo.backup  CentOS-fasttrack.repo  CentOS-Vault.repo
[root@localhost yum.repos.d]#

从对报错内容的分析来看, 应该是软件源有重复(“listed more than once”), 所以这里我们尝试删除一些上面的软件源配置文件.
在删除之前, 先对 /etc/yum.repos.d/ 目录下的文件做一个整体的备份, 以便于尝试失败后的还原, 操作过程如下:
/etc/yum.repos.d/ 目录下的文件整体压缩成一个 .zip 文件:

zip centos7-repo.zip /etc/yum.repos.d/*

然后执行删除操作:

rm -rf CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo

之后把 CentOS7-Base-163.repo 中的内容复制进 CentOS-Base.repo:

cp -p CentOS7-Base-163.repo CentOS-Base.repo

最后删除 CentOS7-Base-163.repo:

rm -rf CentOS7-Base-163.repo

之后运行如下命令重建缓存, 没有再出现”Repository base is listed more than once in the configuration”的报错:

yum clean all
yum makecache

但是, 在我尝试使用 yum 命令安装软件时, 仍然遇到了”没有可用软件包 XXX”的报错, 如下:

[root@localhost yum.repos.d]# yum install htop
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
没有可用软件包 htop。
错误:无须任何处理

“没有可用软件包”说明在 YUM 源中没有对应的软件包(163 的源本身应该是没有问题的, 这是一个大家都常使用的 Linux 方面的国内软件源).
其实, 在 CentOS 和 RHEL 等操作系统中, 常使用的软件源不仅有 YUM, 还有 EPEL. EPEL 英文全称为:”Extra Packages for Enterprise Linux”. 直译为中文就是”用于企业 Linux 的额外软件包”. EPEL 是 Fedora 的一个项目, 有关该项目的官方说明可以在下面的链接中找到:

EPEL – Fedora Project Wiki

这里我摘录一段 Fedora 对 EPEL 项目的说明:

企业版 Linux 附加软件包(以下简称 EPEL)是一个 Fedora 特别兴趣小组,用以创建、维护以及管理针对企业版 Linux 的一个高质量附加软件包集,面向的对象包括但不限于 红帽企业版 Linux (RHEL)、 CentOS、Scientific Linux (SL)、Oracle Linux (OL) 。

EPEL 的软件包通常不会与企业版 Linux 官方源中的软件包发生冲突,或者互相替换文件。EPEL 项目与 Fedora 基本一致,包含完整的构建系统、升级管理器、镜像管理器等等。

https://fedoraproject.org/wiki/EPEL/zh-cn

在 CentOS 7 中安装 EPEL 源的命令如下:

yum install -y epel-release

安装完成后, 在 /etc/yum.repos.d 目录下会多出来下面两个文件, 这两个文件就是 EPEL 源的配置文件:

  • epel.repo
  • epel-testing.repo

查看 epel.repo 文件中的内容可以发现其中软件源的地址指向的是 https://mirrors.fedoraproject.org/, epel-testing.repo 这个文件中的软件源的地址也是指向的是 https://mirrors.fedoraproject.org/. 为了加快软件安装速度, 我们可以将其更改为国内的 EPEL 源, 操作步骤如下:

进入 /etc/yum.repos.d 目录, 下载阿里云 EPEL 源:

wget http://mirrors.aliyun.com/repo/epel-7.repo

备份 Fedora 官方提供的 EPEL 源配置文件:

cp -p epel.repo epel.repo.bak
cp -p epel-testing.repo epel-testing.repo.bak

删除 epel-testing.repo:

rm -rf epel-testing.repo

epel-7.repo 中的内容覆盖写入到原来的 epel.repo 文件中:

cp -p epel-7.repo epel.repo

删除 epel-7.repo 文件:

rm -rf epel-7.repo

重新生成缓存:

yum clean all
yum makecache

之后可以正常安装软件.

总结

遇到”Repository base is listed more than once in the configuration”的问题要考虑系统中是否存在重复的软件源, 遇到”没有可用软件包 XXX”的问题首先要确认要安装的软件包名称是否写对了, 例如安装 pip 的命令不是 yum install pip, 而是 yum install python-pip, 在此之后如果问题仍然存在就需要考虑当前系统中是否正确配置了 YUM 和 EPEL 两个软件源.

Ubuntu 19.04 国内更新源

2019年4月18日, Ubuntu 19.04 正式发布. Ubuntu 19.04 的 Codename 是”disco(迪斯科舞厅)”:

zkf@ubuntu:~$ lsb_release -c
Codename:    disco

为了方便国内用户使用最新版的 Ubuntu 19.04, 本文提供了 Ubuntu 19.04 的国内更新源以及更改更新源的完整步骤.

进入更新源文件所在目录:

cd /etc/apt/

备份原有更新源文件:

sudo cp -p sources.list sources.list.bak

编辑更新源文件:

sudo vi sources.list

写入如下国内更新源:

#阿里云源
deb http://mirrors.aliyun.com/ubuntu/ disco main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ disco main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ disco-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ disco-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ disco-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ disco-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ disco-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ disco-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ disco-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ disco-proposed main restricted universe multiverse

#中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ disco main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ disco main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ disco-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ disco-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ disco-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ disco-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ disco-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ disco-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ disco-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ disco-proposed main restricted universe multiverse

#163源
deb http://mirrors.163.com/ubuntu/ disco main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ disco-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ disco-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ disco-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ disco-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ disco main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ disco-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ disco-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ disco-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ disco-backports main restricted universe multiverse

#清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ disco-proposed main restricted universe multiverse

更新系统:

sudo apt-get update
sudo apt-get upgrade

降低 Kali Linux 资源占用:配置使用 Xfce 4 桌面环境

前言

Xfce Desktop Environment website:
https://www.xfce.org/

Xfce-维基百科:
https://zh.wikipedia.org/wiki/Xfce

Xfce 不是最华丽的 Linux 桌面环境,但却是相当节省系统资源的 Linux 桌面环境。就我个人的使用习惯而言,在 Linux 上,特别是 Linux 虚拟机中使用 Xfce 桌面是一个极佳的选择,因为这样可以把有限的系统资源更多地用于处理生产性作业。
Xfce 最新的版本是 “4.12”.
Kali Linux 2019.1 以及该版本之前的一些版本使用的都是 Gnome 桌面环境而不是 Xfce, 因此,本文就从降低系统资源占用的角度出发,介绍一下将 Kali 的桌面环境从 Gnome 更换到 Xfce 4 的过程。

过程

安装 Xfce 4,命令:

apt install kali-defaults kali-root-login desktop-base xfce4 xfce4-places-plugin xfce4-goodies

在安装的过程中(可能)会要求我们选择提供图形化系统登录界面的图形管理程序(A display manage is a program that provides graphical login for the X Windows System.),只有一个显示管理器可以管理给定的 X server (X server 是用于管理图形化界面的服务器端程序),但是如果当前系统中安装了多个显示管理器包,就需要选择一个默认的显示管理器(Only one display manage can manage a given X server, but multiple display manager packages are installed. Please select which display manager should run by default.),这里我选择的默认显示管理器是 “gdm3”, 如图 1:

图 1
图 1

切换桌面:

update-alternatives --config x-session-manager

回显如下:

root@kali:~# update-alternatives --config x-session-manager
There are 3 choices for the alternative x-session-manager (providing /usr/bin/x-session-manager).

  Selection    Path                    Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gnome-session   50        auto mode
  1            /usr/bin/gnome-session   50        manual mode
  2            /usr/bin/startxfce4      50        manual mode
  3            /usr/bin/xfce4-session   40        manual mode

Press <enter> to keep the current choice[*], or type selection number:

输入 3 以启动 Xfce4,回显如下:

root@kali:~# update-alternatives --config x-session-manager
There are 3 choices for the alternative x-session-manager (providing /usr/bin/x-session-manager).

  Selection    Path                    Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gnome-session   50        auto mode
  1            /usr/bin/gnome-session   50        manual mode
  2            /usr/bin/startxfce4      50        manual mode
  3            /usr/bin/xfce4-session   40        manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/xfce4-session to provide /usr/bin/x-session-manager (x-session-manager) in manual mode

卸载 Gnome 桌面环境:

apt remove gnome-core
apt remove gnome-shell

重启系统:

reboot

重新登录系统之后可以看到已经成功地将 Kali Linux 的桌面环境更换为 Xfce 4,如图 2:

图 2
图 2

在 Kali 和 Ubuntu 上安装 Code Blocks

操作环境

Kali 2019.1

操作步骤

添加软件源:

root@kali:~# add-apt-repository ppa:damien-moore/codeblocks-stable

更新软件源:

root@kali:~# sudo apt-get update

安装 Code Blocks:

root@kali:~# sudo apt-get install codeblocks

启动 Code Blocks:

root@kali:~# codeblocks

之后, 可以参考我这篇博文对 Code Blocks 的外观进行优化, 文章地址:
http://zhaokaifeng.com/?p=1590

Kali Linux 忘记系统登录密码后的重置密码操作

前言

如果忘记了系统的登录密码, 最关键的需求就是重置 root 用户的登录密码, 之后使用 root 账户可以修改其他账户的密码. 因此, 本文就介绍一下在不知道 root 用户登录密码的情况下如何重置 root 账户的密码.

操作环境

Kali Linux 2019.1

操作步骤

启动 Kali Linux, 在启动了 GNU GRUB (GNU 引导) 界面时按 e 进入编辑模式.
之后找到如图 1 所示的位置, 把其中的 ro 改成 rw, 并删除 .gz 后面的 quite, 替换成 init=/bin/bash.

图 1
图 1

修改后如图 2 所示:

图 2
图 2

修改完成之后, 使用 Ctrl +X 组合键继续系统的启动进程, 此时是可以无密码直接进系统的, 如图 3:

图 3
图 3

在图 3 中所示的 # 提示符后面输入重置密码的 passwd 命令即可修改 root 用户的密码并使用修改后的密码正常登陆系统.

对使用 Z-BlogPHP 搭建的网站进行安全加固 (上)

前言

Z-BlogPHP 是一款常用的 Web 博客程序, 许多网站都是使用 Z-BlogPHP 搭建的. 今天, 我来结合自己目前所掌握的知识谈谈对使用 Z-BlogPHP 搭建的网站进行安全加固的方法. 希望本文能让更多的网站尽可能地远离安全威胁.

网站加固涉及很多方面, 有 Web 程序的加固, 中间件的加固, 代码运行环境的加固, 还有 Web 服务器的加固等, 本文只讨论对 Web 程序, 也就是 Z-BlogPHP 本身的加固.

操作环境

Z-BlogPHP 版本: Z-BlogPHP 1.5.2 Zero 正式版

加固步骤

保护登录入口

使用 Google 两步验证

两步验证相当于给登录过程加了两把锁, 即使我们网站的登录密码被恶意获取和利用, 攻击者也无法仅仅依靠该密码就成功登录网站后台. 两步验证的实现方式中常用的大致有两种:

  • 手机短信验证码
  • 虚拟 MFA

使用”手机短信验证码”的方式进行验证就是在登录的时候除了要输入用户名和密码之外还会要求输入一个由服务器发来的手机短信. 虚拟 MFA 的作用和手机短信验证码类似, 只不过虚拟 MFA 可以基于时间 (或者计数器) 生成验证码 (每 30 秒自动生成一个 6 位数字), 不需要联网即可运作.

目前可以提供虚拟 MFA 验证的软件有:

  • Authy
    官网: https://authy.com/
    Authy 提供的验证程序几乎覆盖了目前所有主流操作系统, 其支持的平台有 iOS, Android, Windows, macOS 以及 Chrome 浏览器.
  • 1Password
    官网: https://1password.com/
    1Password 是一个密码管理器, 也支持两步验证.
  • Microsoft Authenticator
    官网: https://www.microsoft.com/en-us/account/authenticator
    微软出品的两步验证程序.
  • Google 2-Step Verification
    官网: https://www.google.com/landing/2step
    Google 出品的两步身份验证器.

想要在 Z-BlogPHP 中使用两步验证, 首先需要在 Z-BlogPHP 的应用中心搜索”Google两步验证”找到相关插件, 插件 ID 是”LiangbuLogin”. 下载完成之后, 启用该插件.

下面我在手机上使用 Google 两步验证程序”Google 身份验证器”和 Z-BlogPHP 中的”Google两步验证”插件演示配置并启用两步验证的过程.

首先, 在 Z-BlogPHP 的管理后台中进入”Google两步验证”插件的配置界面并打开手机上的”Google 身份验证器”, 之后的操作过程如图 1 所示:

图 1
图 1

之后, 再登陆 Z-BlogPHP 的后台时会要求输入 Google 两步验证的验证码, 如图 2 所示.

图 2
图 2

如果进行两步验证的设备丢失, 可以在服务上删除如下目录及文件即可取消 Google 两步验证:

XX/zb_users/plugin/LiangbuLogin

另外, 需要注意的是, 如果设备支持的话, 请务必给进行两步验证的程序加上应用锁以尽可能避免未经授权的使用.

修改默认登录地址

Z-BlogPHP 默认的登录地址如下:

https://域名/zb_system/login.php

如果使用默认的登录地址的话, 就是把网站登录入口直接暴露在攻击者面前, 这是一个严重的不安全因素. 下面演示修改默认登录地址的方法.

首先将 zb_system/ 目录下的 login.php 文件修改成一个随机名称, 例如: ajdvirb6zmg9s7k2.php, 之后, 登录地址就变成了:

https://域名/zb_system/ajdvirb6zmg9s7k2.php

下一步, 在当前网站所使用的主题 (一般位于 xx/zb_users/theme/ 目录下) 下面找到 include.php 这个文件, 在其中加入如下 PHP 代码:

#修改默认登录地址
function zpnfewmcbxgsak(){
   global $zbp;
   $sfwidmsahdgv="ssocnf7sbsnxs";
   $dsdsuacskpqba="sdvn2ps3m2n";
   if($_GET[''.$sfwidmsahdgv.''] !== ''.$dsdsuacskpqba.'') {
      Redirect($zbp->host);
      die();
   }
}

之后, 同样在 include.php 这个文件中, 找到 function ActivePlugin_主题 ID(){} 函数, 在其中加入如下 PHP 代码:

Add_Filter_Plugin('Filter_Plugin_Login_Header','zpnfewmcbxgsak');

经过上述操作之后, 登录地址就变成了:

https://域名/zb_system/ajdvirb6zmg9s7k2.php?ssocnf7sbsnxs=sdvn2ps3m2n

上面地址中的任意一个字符不对都将无法打开登录页面.
如果忘记了登录地址, 只需要进入服务器, 找到上面所作的更改并组合成登录地址即可.

需要注意的一点是, Z-BlogPHP 默认会把后台登录地址显示在网站前台, 这个组件一定要去掉.

修改登录页面默认标题和内容

通常情况下, 登录页面都会有一些和登录相关的关键词, 例如”登录”, “用户登录”, “login”, “网站后台”, “用户名”和”密码”等. 如果登录界面被搜索引擎爬取到了, 那么攻击者通过类似”Google hack”这样的方式就有可能获取网站登录后台的地址. 因此, 有必要把登录页面的一些关键词修改成和”登录”以及”网站后台”无关的内容. 修改方法如下:

打开 zb_system/ 目录下的 login.php 文件(如果您按照上面的过程进行了修改, 那么此时, 这个文件的名称应该是 ajdvirb6zmg9s7k2.php, 具体名称以您的修改操作为准.), 进行如下修改:

修改用户名输入框的提示字符, 将:

<dd class="username"><label for="edtUserName"><?php echo $lang['msg']['username'] ?></label><input type="text" id="edtUserName" name="edtUserName" size="20" value="<?php echo GetVars('username', 'COOKIE') ?>" tabindex="1" /></dd>

修改成:

<dd class="username"><label for="edtUserName"><?php echo "hskVex" ?></label><input type="text" id="edtUserName" name="edtUserName" size="20" value="<?php echo GetVars('username', 'COOKIE') ?>" tabindex="1" /></dd>

修改密码输入框的提示字符, 将:

<dd class="password"><label for="edtPassWord"><?php echo $lang['msg']['password'] ?></label><input type="password" id="edtPassWord" name="edtPassWord" size="20" tabindex="2" /></dd>

修改成:

<dd class="password"><label for="edtPassWord"><?php echo "sFhfc" ?></label><input type="password" id="edtPassWord" name="edtPassWord" size="20" tabindex="2" /></dd>

修改页面标题, 将:

<title><?php echo $blogname . '-' . $lang['msg']['login'] ?></title>

修改成:

<title><?php echo "HFxs&3^k" . '-' . "pJ18&qxF" ?></title>

修改登录界面的图片标题和图片说明, 将:

<div class="logo"><img src="image/admin/none.gif" title="<?php echo htmlspecialchars($blogname) ?>" alt="<?php echo htmlspecialchars($blogname) ?>"/></div>

修改成:

<div class="logo"><img src="image/admin/none.gif" title="<?php echo "DshjFac@1A7%" ?>" alt="<?php echo "DsE2vshKw7" ?>"/></div>

修改”保持登录”提示字符, 将:

<dd class="checkbox"><input type="checkbox" name="chkRemember" id="chkRemember"  tabindex="98" /><label for="chkRemember"><?php echo $lang['msg']['stay_signed_in'] ?></label></dd>

修改成:

<dd class="checkbox"><input type="checkbox" name="chkRemember" id="chkRemember"  tabindex="98" /><label for="chkRemember"><?php echo "Qh1A2s$sAv%gC*" ?></label></dd>

修改登录按钮, 将:

<dd class="submit"><input id="btnPost" name="btnPost" type="submit" value="<?php echo $lang['msg']['login'] ?>" class="button" tabindex="99"/></dd>

修改成:

<dd class="submit"><input id="btnPost" name="btnPost" type="submit" value="<?php echo "HCL9" ?>" class="button" tabindex="99"/></dd>

记录访问登录页面的 IP 地址

对于记录 IP 地址这个功能, 我们可以使用第三方的网站统计服务来实现. 我们可以申请一个统计代码, 而且只将这个统计代码放在登录页面, 这样就可以记录到所有访问过登录界面的 IP 地址, 根据这些 IP 地址和登陆时间就可以大致判断网站的登录界面是否已经被攻击者掌握. 但是, 使用第三方服务也就意味着我们的后台登录地址将上传到第三方平台的服务器, 从而增大了后台登录地址可能受到攻击的攻击面, 在这里我们通过一段 PHP 代码实现对访问了登录页面的 IP 地址进行记录的功能.

打开 zb_system/ 目录下的 login.php 文件(如果您按照上面的过程进行了修改, 那么此时, 这个文件的名称应该是 ajdvirb6zmg9s7k2.php, 具体名称以您的修改操作为准.), 添加如下代码:

<?php
$ip = $_SERVER["REMOTE_ADDR"];
$var = "$ip;\n";

file_put_contents('ip.md', $var, FILE_APPEND | LOCK_EX);
?>

上述代码将在当前路径下创建 ip.md 文件并将带有当前访问者 IP 地址的变量 $var 的值以追加的方式 (使用参数 FILE_APPEND 实现内容追加) 写入到 ip.md 文件. 今后, 我们可以通过 ip.md 文件记录的内容获知是否有未授权的 IP 地址打开过登录界面.

使用强登录密码

这一点无需多言, 登录密码至少需要有 16 位, 且必须包括大小写字母, 数字和特殊字符并经常更换.

启用 Z-BlogPHP 自带的安全设置

在 Z-BlogPHP 的管理后台的”网站设置 / 全局设置”中开启”安全增强”并关闭”开发模式”, 如图 3:

图 3
图 3

在安装完必要的插件之后, 在 Z-BlogPHP 的管理后台的”应用中心 / 安全模式”中开启安全模式, Z-BlogPHP 建议我们不要使用可以进行文件管理, 数据库管理, 主题编辑和网站备份的插件, 如图 4:

图 4
图 4

如果要退出安全模式, 需要进入网站的服务器端, 手动删除以下文件:

/zb_users/data/appcentre_security_mode.php

之后, 在网站后台中进入”插件管理”, 停止”应用中心客户端”的运行. 今后只需要每隔特定时间检查一次更新或者在获知有新版本的程序发布时开启”应用中心客户端”进行一下更新即可.

防止恶意上传

由于我使用 Z-BlogPHP 搭建的网站中主要使用的图片是 .webp 格式, 除此之外基本没有上传过其他格式的文件, 因此可以在后台去掉对不常用的文件格式的上传支持. Z-BlogPHP 默认支持的上传格式如下:

jpg|gif|png|jpeg|bmp|psd|wmf|ico|rpm|deb|tar|gz|sit|7z|bz2|zip|rar|xml|xsl|svg|svgz|rtf|doc|docx|ppt|pptx|xls|xlsx|wps|chm|txt|pdf|mp3|mp4|avi|mpg|rm|ra|rmvb|mov|wmv|wma|swf|fla|torrent|apk|zba|gzba

我修改后的支持的上传格式如下 (在管理后台的”网站设置 / 全局设置”中可以进行修改):

webp|jpg|gif|png|jpeg|bmp

总之, 将允许上传的文件格式限制得越少越好.

删除不必要的文件

Z-BlogPHP 的安装程序在 zb_install 目录下, 安装完成后 zb_install 这个目录及其下的所有文件都可以直接删除以减少网站的受攻击面 (该删除操作不会影响网站的正常登陆和访问).

Solve the Problem of ownCloud: ‘No Keychain Service Available’ on Ubuntu 18.04

Operating Environment

Operating system: Ubuntu 18.04.2 LTS
ownCloud client version: 2.4.1

Problem Description

I use ownCloud in Ubuntu and I add one account to it. But whenever I reboot Ubuntu, ownCloud will tell me: “No keychain service available” and I’ll be asked to enter the password once, as show in the figure 1:

Figure 1
Figure 1

Once I enter the password, ownCloud will work properly. But once I restart Ubuntu Linux, that happens again and again. Passwords should be stored, but it didn’t.

Solve the Problem

I found a solution on Github through Bing and that link is HERE. It seems that I am not the only one who has encountered this problem.

The solution is very simple, installing:

sudo apt install libgnome-keyring0

Then, reboot Ubuntu Linux, after you log in to the system, you will be asked to enter a password once, only once, whether you restart Ubuntu or not, you will not be asked to enter ownCloud’s password again unless you exit ownCloud account.

This problem has been solved.

在 Windows 10 上优化 CodeBlocks 外观 (主题 + 字体)

操作环境

操作系统: Windows 10 64 位 中文家庭版
CodeBlocks 版本: Code::Blocks 17.12

操作说明

CodeBlocks 是一款优秀的 IDE, 但是其默认的主题实在是不能满足我对一个代码编译器最基本的需求: 不使用亮色主题.
CodeBlocks 默认的主题是白色的, 如图 1:

图 1
图 1

在写代码时, 编辑器通常都是全屏显示的, 白色的主题看久了眼睛是受不了的. 不过, 好在 CodeBlocks 官网上提供了暗色的主题可供选择, 本文就介绍一下通过 CodeBlocks 官网提供的主题代码更换 CodeBlocks 主题以及修改 CodeBlocks 默认字体的方法.

继续阅读“在 Windows 10 上优化 CodeBlocks 外观 (主题 + 字体)”

在 Debian 7 Linux 中将 PHP 5.4 升级到 PHP 5.6

操作环境

root@IronMan:~# cat /etc/issue
Debian GNU/Linux 7 \n \l

操作步骤

指定软件源, 编辑:

vim /etc/apt/sources.list.d/dotdeb.list

写入如下内容:

deb http://packages.dotdeb.org wheezy-php56 all
deb-src http://packages.dotdeb.org wheezy-php56 all

将上述软件源加入 apt key:

wget http://www.dotdeb.org/dotdeb.gpg -O- | apt-key add -

更新可用包列表:

aptitude update

升级 PHP 版本:

aptitude install php5-cli php5-fpm

CentOS/Ubuntu 创建 SWAP 交换分区

之前我写过一篇创建 Linux 交换分区的文章:
在不重装系统的情况下创建Linux的Swap分区
但是这次创建交换分区的方法和上次的有些区别, 再次记录一下.

操作环境

本文方案在以下操作系统中测试通过:
CentOS 7
Ubuntu 16.04

操作步骤

查看系统中的分区:

fdisk -l

或者, 查看当前分区:

df ./

根据上面查找到的分区信息, 选定一块分区, 从中划分出一个交换分区, 例如, 我选定的是 /dev/vda1 分区.

/dev/vda1 分区中分出一块大小为 4GB (4194304 字节) 的空间, 输出为 /var/swap, 命令如下:

dd if=/dev/vda1 of=/var/swap bs=1024 count=4194304

/var/swap 设置为交换分区:

mkswap /var/swap

设置开机自动挂载, 编辑:

vim /etc/fstab

添加如下信息:

/var/swap swap swap defaults 0 0

最后重启服务器:

reboot

重启后登录服务器就可以看到一个大小为 4GB 的交换分区了, 如图:

图 1
图 1

CentOS Linux 下部署 phpMyAdmin 并解决报错

操作环境

操作系统: CentOS 7
PHP 版本: PHP 7
phpMyAdmin 版本: phpMyAdmin-4.8.5-all-languages
Web 服务器: Apache

phpMyAdmin 是一个基于 PHP 环境的运行在 Web 服务器上的 MySQL 数据库管理工具, 借助 phpMyAdmin, 可以在 Web 浏览器上管理 Mysql 数据库.

phpMyAdmin 官网地址: https://www.phpmyadmin.net/

操作步骤

phpMyAdmin 需要借助 Web 服务器运行, 因此首先进入 Web 服务器的网站根目录:

cd /var/www/html/

下载 phpMyAdmin 安装文件:

wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-all-languages.zip

解压缩:

unzip phpMyAdmin-4.8.5-all-languages.zip

为了尽可能防止 phpMyAdmin 被恶意破解, 可以把解压得到的 phpMyAdmin 默认的文件名改成一个随机的名称:

mv phpMyAdmin-4.8.5-all-languages sofdfdlrbvswskdscdf

之后复制 phpMyAdmin 提供的示例配置文件为我们自己的配置文件:

cd sofdfdlrbvswskdscdf
cp -p config.sample.inc.php config.inc.php

之后可以在浏览器中使用 IP/sofdfdlrbvswskdscdf 或者 域名/sofdfdlrbvswskdscdf 打开 phpMyAdmin 的登陆界面并使用 MySQL 的用户名和密码登陆.

解决报错

报错 1: The configuration file now needs a secret passphrase (blowfish_secret).

这个报错直接翻译过来就是:”配置文件现在需要一个机密口令 (blowfish_secret)”.
出现这个报错是因为 phpMyAdmin 使用了 blowfish 加密算法对 CCOKIE 进行认证, 因此用户必须给定一个随机字符串用于认证.

解决步骤:
在 phpMyAdmin 的根目录下打开配置文件:

vim config.inc.php

可以看到:

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

我们填入一些随机字符, 可以包含大小写字母, 数字和特殊字符, 例如:

$cfg['blowfish_secret'] = 'h2s#AjfF%f*AdSk$w';

这些随机字符串要足够长, 至少需要 32 位, 否则会报如下错误(上面示例中的随机字符串不够长):

The secret passphrase in configuration (blowfish_secret) is too short.

完成上述操作并保存退出之后, 重新登陆 phpMyAdmin 即可发现该报错已消失.

报错 2: The $cfg‘TempDir’ is not accessible. phpMyAdmin is not able to cache templates and will be slow because of this.

这个报错翻译过来就是:”无法获取 $cfg‘TempDir’. phpMyAdmin 无法缓存模板并将因此变慢”.

解决步骤:
在 phpMyAdmin 的根目录下创建一个 tmp 文件并修改其所属用户和组即可, 命令:

mkdir tmp
chown -R apache:root tmp/

之后, 刷新 phpMyAdmin 的 Web 界面, 该报错即消失.

本文所示的方法同样可以用于在 Ubuntu Linux 等其他大部分 Linux 发行版中部署 phpMyAdmin.


荒原之梦网全部内容均为原创,提供了涵盖考研数学基础知识、考研数学真题、考研数学练习题和计算机科学等方面,大量精心研发的学习资源。

意见反馈 | 内容纠错 | 微信 | QQ | 公众号 | 知乎 | 微博 | 博客园 |CSDN | B 站 | 电子邮件
豫 ICP 备 17023611 号-1 | 公网安备 - 荒原之梦 豫公网安备 41142502000132 号 | SiteMap
Copyright © 2017-2024 ZhaoKaifeng.com 版权所有 All Rights Reserved.

Copyright © 2024   zhaokaifeng.com   All Rights Reserved.
豫ICP备17023611号-1
 豫公网安备41142502000132号

荒原之梦 自豪地采用WordPress