架设镜像站点适用于内网及隔离网络,特别是隔离网络中有源和没有源简直是两个感受,在此以CentOS系统为例子,记录本人架设镜像站点的心得。
使用reposync同步
安装同步工具
以前同步使用的是rsync工具再加上createrepo来生成元数据,但现在有更好的办法,CentOS 中使用reposync工具。
# CentOS 7
sudo yum install yum-utils
# CentOS 8
sudo dns install dnf-utils
同步默认仓库
安装完成后,就可以立即执行仓库同步。
CentOS 7的默认仓库包含:
- base
- updates
- extras
CentOS 8的默认仓库包含:
初次同步
// CentOS 7
sudo reposync --download-metadata -p /home/repos
// CentOS 8
sudo dnf reposync --download-metadata --destdir /home/repos
说明:
- “--download-metadata"下载元数据,否则需要使用createrepo生成。
- ”-p"和"--destdir"指定存放目录,默认是命令执行的当前目录。
- 上述命令会同步当前所有有效的源,可以用命令"yum repolist"查看,或者查看.repo文件中"[]"中的描述,且同时enable=1。
更新同步
// CentOS 7
sudo reposync --download-metadata -p /home/repos --delete -n
说明:
- “--delete"删除仓库中不存在的包。
- “-n"只更新最新的,增量更新。
更新EPEL
EPEL:Extra Packages for Enterprise Linux,作为重要的CentOS源很多地方都需要。
- 安装epel源
// CentOS 7
sudo yum install epel-release
// CentOS 8
- 更新epel源
操作方法可以使用上面的增量更新,也可以"-repo <repo_id>“来更新指定的源。
// CentOS 7
sudo reposync --download-metadata -p /home/repo --repo epel
// CentOS 8
sudo dnf reposync --download-metadata -p /home/repo --repo epel
更具官方EPEL文档的说明,CentOS 8中如果使用EPEL,建议使能powertools源
sudo dnf reposync --download-metadata -p /home/repo --repo powertools
更新其它架构的源镜像
之前更新其它架构的源镜像(主要是ARM),我自己用QEMU虚拟了一个aarch64的虚拟机,虽然解决了问题,但是跑起来没有x86_64的快,另外如果是在windows上使用vbox之类还处理不了aarch64的虚拟化问题,因此又研究了下。
一是看参数:reposync或者dnf reposync有个参数选项为--arch,看上去像是,但是没有成功,只是把noarch的包同步了下来;二是改源的url,成功了,以下是修改时需要解释的几个变量。
- $releasever: 当前系统的发行版本号,例如 “7”,可以使用如下命令查看
rpm -q --qf %{version} centos-release
- $basearch: 当前系统的CPU架构,例如“x86_64”、“aarch64”,可以使用如下命令查看
rpm -q --qf %{arch} centos-release
- $infra: 就是stock,在/etc/yum/vars/目录中的自定义变量
另外通过如下命令可以查看centos-release包的信息rpm -qi centos-release
知道上述几个变量后,可以将$basearch指定为需要同步的机构即可进行源的同步操作了,如把$basearch修改为aarch64,即可同步aarch64的包。
安装镜像站点
Web站点使用Apache实现(因为系统自带)。
安装Apache
sudo yum install httpd -y
配置Apache
新建源镜像站点的配置文件repos.conf
sudo vim /etc/httpd/conf.d/repos.conf
Alias /repos /var/www/repos
<Directory /var/www/repos>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Apache属性说明
Apache 使用<Directory>… </Directory>来设置指定目录的访问权限,该设置对子目录同样有效,其中可包含五个属性:
Options
AllowOverride
Order
Allow
Deny
- Options可以组合设置下列选项:
All:用户可以在此目录中作任何事情。 ExecCGI:允许在此目录中执行CGI程序。 FollowSymLinks:服务器可使用符号链接指向的文件或目录。 Indexes:服务器可生成此目录的文件列表。 None:不允许访问此目录。
- AllowOverride 会根据设定的值决定是否读取目录中的.htaccess文件,来改变原来所设置的权限:
All:读取.htaccess文件的内容,修改原来的访问权限。 None:不读取.htaccess文件
为避免用户自行建立.htaccess文件修改访问权限,apache2.conf文件中默认设置每个目录为:
AllowOverride None。
- Allow 用于设定允许访问Apache服务器的主机,例如:
Allow from all # 允许所有主机的访问 Allow from 202.96.0.97 202.96.0.98 # 允许来自指定IP地址主机的访问
- Deny 用于设定拒绝访问Apache服务器的主机,例如:
Deny from all # 拒绝来自所有主机的访问 Deny from 202.96.0.99 202.96.0.88 # 拒绝指定IP地址主机的访问
- Order 用于指定allow和deny的先后次序:Order allow,deny
Apache 的 SELinux 的布尔变量
对于网络服务而言,SElinux 仅仅开放了最低运行需求,为了发挥 Apache 服务器的功能还必须把布尔值必须打开,以允许某些行为包括允许 httpd 脚本网络访问, 允许 httpd 访问 NFS 和 CIFS 文件系统, 允许执行通用网关接口(CGI)脚本 。可以使用命令 getsebool 查询当前布尔变量。然后可以使用下面的 setsebool 命令开放布尔变量:
#setsebool – P httpd_enable_cgi on
下面是常用的布尔变量:
allow_httpd_anon_write 禁用时这个布尔变量允许的 httpd 到只有标记文件 public_content_rw_t 类型的读取访问。启用此布尔变量将允许的 httpd 写入到文件标记与一个公共文件目录包含一个公共文件传输服务,如 public_content_rw_t 类型。
allow_httpd_mod_auth_pam 启用此布尔变量允许 mod_auth_pam 模块访问 httpd。
allow_httpd_sys_script_anon_write 这个布尔变量定义 HTTP 脚本是否允许写访问到文件标记在一个公共文件传输服务 public_content_rw_t 类型。
httpd_builtin_scripting 这个布尔变量定义 httpd 的脚本的访问。在这个布尔变量启用,往往需要为 PHP 内容。
httpd_can_network_connect 禁用时这个布尔变量防止从网络或远程端口发起连接的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
httpd_can_network_connect_db 禁用时这个布尔变量防止发起一个连接到数据库服务器的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
httpd_can_network_relay 打开这个当布尔变量的 httpd 正在使用正向或反向代理。
httpd_can_sendmail 禁用时这个布尔变量防止发送邮件的 HTTP 模块。这可以防止垃圾邮件的***漏洞中发现的 httpd。打开这个布尔变量允许 HTTP 模块发送邮件。
httpd_dbus_avahi 关闭时这个布尔变量拒绝服务的 avahi 通过 D-BUS 的 httpd 访问。打开这个布尔变量允许这种访问。
httpd_enable_cgi 禁用时这个布尔变量防止 httpd 的执行 CGI 脚本。打开这个布尔变量让 httpd 的执行 CGI 脚本。
httpd_enable_ftp_server 开放这个布尔变量会容许的 httpd 作为 FTP 服务器的 FTP 端口和行为。
httpd_enable_homedirs 禁用时这个布尔变量阻止访问用户主目录的 httpd。打开这个布尔变量允许 httpd 访问用户主目录。
httpd_execmem 启用时这个布尔变量允许 httpd 的执行程序需要的内存地址。建议不要启用这个布尔变量从安全角度来看,因为它减少了对缓冲区溢出,但是某些模块和应用程序(如 Java 和 Mono 应用)的保护需要这种特权。
httpd_ssi_exec 这个布尔变量定义服务器端包含(SSI)的网页中的元素是否可以执行。
httpd_tty_comm 这个布尔变量定义的 httpd 是否被允许访问的控制终端。这种访问通常是不需要的,但是,如配置 SSL 证书文件的情况下,终端访问所需的显示和处理一个密码提示。
httpd_use_cifs 打开这个布尔变量允许 httpd 访问 CIFS 文件系统上标记的文件,如通过 Samba 挂载的文件系统,cifs_t 类型。
httpd_use_nfs 打开这个布尔变量允许 httpd 访问 NFS 文件系统上的标记文件 nfs_t 类型,如文件系统,通过 NFS 挂载。
Apache 的 SELinux 的文件类型
当启用 SELinux 是,Apache HTTP 服务器(httpd)默认情况下在受限的 httpd_t 域中运行,并和其他受限制的网络服务分开。即使一个网络服务被者破坏,者的资源和可能造成的损害是有限的。
下面的示例演示的是 SELinux 下的 httpd 进程。
$ ps -eZ | grep httpd
unconfined_u:system_r:httpd_t:s0 2850 ? 00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2852 ? 00:00:00 httpd
……
和 SELinux 上下文相关的 httpd 进程是 system_u:system_r:httpd_t:s0。 httpd 进程都运行在 httpd_t 域中。文件类型必须正确设置才能让 httpd 访问 。例如 httpd 可以读取文件类型是 httpd_sys_content_t,但不能写和修改。
此外 httpd 不能访问 samba_share_t 类型的文件(Samba 访问控制的文件),也不能访问用户主目录中被标记为与 user_home_t 文件类型,主要是防止 httpd 读写用户主目录中的文件并且继承其访问权限。httpd 可以读写的文件类型是 httpd_sys_content_rw_t。
Apache 默认的文档根目录类型是 httpd_sys_content_t。除非另外设置 httpd 只能访问/var/www/html/目录中的 httpd_sys_content_t 类型的文件和子目录。
此外,SELinux 还针对 httpd 定义了一些文件类型:
- httpd_sys_content_t 主要用于提供静态内容服务的文件,如 HTML 静态网站使用的文件。这种类型的标记文件可以访问(只读)httpd 和执行脚本 httpd。默认情况下,这种类型的文件和目录标记不能被写入或修改 httpd 或其他进程。 注意:默认情况下,创建的文件或复制到的 /var/www/html/httpd_sys_content_t 类型的标记。
- httpd_sys_script_exec_t 主要用于设置 /var/www/cgi-bin/ 目录下的 cgi 脚本。默认情况下 SELinux 策略防止 httpd 执行 CGI 脚本。
- httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的类型标签读取和写脚本标记文件 httpd_sys_script_exec_t 的类型。
- httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的类型标签将读取和附加标记的脚本文件 httpd_sys_script_exec_t 类型。
改变软链接目的文件目录及其里面的文件属性,运行如下命令sudo chcon -R -t httpd_sys_content_t /home/mgr/repos
同时保证路径/home/mgr/repos的文件操作权限为755。
说明:使用 chcon 命令来对文件的类型进行重新标识。然而,这样的标识不是永久性的修改,一旦系统重启,该标识就会改变回去。对于文件类型的永久性改变,需要采用 semanage 命令和restorecon命令。# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?" # restorecon -R -v /mywebsite
chcon、 semanage fcontext 和 restorecon 三个命令使用方法:
- chcon 命令
作用:chcon 命令用来改变 SELinux 文件属性即修改文件的安全上下文
用法:chcon [ 选项 ] CONTEXT 文件
主要选项 :
-R:递归改变文件和目录的上下文。
--reference:从源文件向目标文件复制安全上下文
-h, --no-dereference:影响目标链接。
-v, --verbose:输出对每个检查文件的诊断。
-u, --user=USER:设置在目标用户的安全上下文。
-r,--role=ROLE:设置目标安全领域的作用。
-t, --type=TYPE:在目标设定的安全上下文类型。
-l, --range=RANGE:设置 set role ROLE in the target security context 目标安全领域的范围。
-f:显示少量错误信息。 - restorecon 命令
作用:恢复 SELinux 文件属性文件属性即恢复文件的安全上下文
用法:restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...]
主要选项 :
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R -r:递归处理目录。
-n:不改变文件标签。
-o outfilename:保存文件列表到 outfilename,在文件不正确情况下。
-v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。
说明:restorecon 命令和 chcon 命令类似,但它基于当前策略默认文件上下文文件设置与文件有关的客体的安全上下文,因此,用户没有指定一个安全上下文,相反,restorecon 使用文件上下文文件的条目匹配文件名,然后应用特定的安全上下文,在某些情况下,它是在还原正确的安全上下文。 - semanage fcontext 命令
作用:管理文件安全上下文
用法:
semanage fcontext [-S store] -{a|d|m|l|n|D} [-frst] file_spec
semanage fcontext [-S store] -{a|d|m|l|n|D} -e replacement target
主要选项 :
-a:添加
-d:删除
-m:修改
-l:列举
-n:不打印说明头
-D:全部删除
-f:文件
-s:用户
-t:类型
-r:角色
查看文件属性使用如下命令:# ls -dZ /mywebsite
关于更改端口号
根据策略配置,服务可能只被允许运行在特定的端口号 。试图改变服务运行的端口,在不改变政策,可能导致启动失败的服务。首先查看一下 SELinux 允许 HTTP 侦听 TCP 端口,使用命令:# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
使用命令修改:
# semanage port -a -t http_port_t -p tcp 12345
然后确认一下:
# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
客户端配置
备份源文件后修改源文件
sudo vim CentOS-Base.repo
[Base]
name=base
baseurl=http://172.16.1.254/centos/7/Base/x86_64
enabled=1
gpgcheck=0
gpgkey=http://172.16.1.254/RPM-GPG-KEY-CentOS-6
sudo vim epel.repo
[epel]
name=epel
baseurl=http://172.16.1.254/epel/7/x86_64
enabled=1
gpgcheck=0
gpgkey=http://172.16.1.254/RPM-GPG-KEY-CentOS-6
使用rsync同步镜像源站点
使用rsync同步镜像源站点,需要站点支持rsync协议,本人找了找发现国内可以用中科大和清华的,但本人连接清华的站点速度太慢,中科大的要好点,而且有文档说明,因此以下使用中科大的源镜像站点进行举例说明。
同时使用rsync进行站点镜像还有一个好处就是可以镜像不同架构源,甚至其它软件源如pypi。以下列举我同步使用的脚本。
使用rsync同步Centos 7
#!/bin/bash
VER='7'
REPOS=(os updates extras)
for REPO in ${REPOS[@]}
do
rsync -auvz --delete --exclude='repodata' \
rsync://rsync.mirrors.ustc.edu.cn/repo/centos/${VER}/${REPO}/x86_64/ ~/repo/centos/${VER}/${REPO}/x86_64/
createrepo ~/repo/centos/${VER}/${REPO}/x86_64/
done
for REPO in ${REPOS[@]}
do
rsync -avz --delete --exclude='repodata' \
rsync://rsync.mirrors.ustc.edu.cn/repo/centos-altarch/${VER}/${REPO}/aarch64/ ~/repo/centos/${VER}/${REPO}/x86_64/
createrepo ~/repo/centos/${VER}/${REPO}/x86_64/
done
使用rsync同步Centos Stream 8
#!/bin/bash
VER='8-stream'
ARCHS=(x86_64 aarch64)
REPOS=(AppStream BaseOS HighAvailability PowerTools extras)
for ARCH in ${ARCHS[@]}
do
for REPO in ${REPOS[@]}
do
rsync -avuz --delete --exclude='repodata' \
rsync://rsync.mirrors.ustc.edu.cn/repo/centos/${VER}/${REPO}/${ARCH}/ ~/repo/centos/${VER}/${REPO}/${ARCH}/
createrepo ~/repo/centos/${VER}/${REPO}/${ARCH}/
done
done
使用rsync同步epel
#!/bin/bash
VERS=(7 8)
ARCHS=(x86_64 aarch64)
# sync epel7
for VER in ${VERS[@]}
do
for ARCH in ${ARCHS[@]}
do
rsync -avuz --delete --exclude={'repodata','debug'} \
rsync://rsync.mirrors.ustc.edu.cn/repo/epel/${VER}/Everything/${ARCH}/ \
~/repo/epel/${VER}/Everything/${ARCH}
createrepo ~/repo/epel/${VER}/Everything/${ARCH}
done
done
使用rsync同步Kubernetes
#!/bin/bash
REPOS=(kubernetes-el7-x86_64 kubernetes-el7-aarch64 minikube-el7-x86_64)
for REPO in ${REPOS[@]}
do
rsync -avz --delete --exclude='repodata' \
rsync://rsync.mirrors.ustc.edu.cn/repo/kubernetes/yum/repos/${REPO} \
~/repo/kubernetes/yum/repos
createrepo ~/repo/kubernetes/yum/repos
done
其它说明
使用rsync同步比较简单,后续Apache的架设和之前类似,不再赘述。另外再使用rsync对中科大的源进行同步时建议使用如下命令查看具体的目录,以根目录repo和centos的源目录进行说明。
rsync rsync://rsync://rsync.mirrors.ustc.edu.cn/repo/ # 查看根repo目录下的内容
rsync rsync://rsync://rsync.mirrors.ustc.edu.cn/repo/centos # 查看根centos目录下的内容