私有镜像部署
有了本地镜像和自定义的deb包,那么接下来就是把自定义的deb包加入到镜像仓库中并发布出来,提供给客户端安装。
4.1 APT安全
4.1.1 APT安全检测机制
创建自己私有镜像仓库,如何保证自己的制作的deb包没有没其他人修改过呢?
即使在生成索引文件Package.gz时对包进行md5sum,SHA256,SHA1校验,校验值放在Release文件,但是依然可以被篡改,所以就引入的签名。签名存在着私钥和公钥,可以用私钥来进行签名,不是加密。如果一个私钥签名了一个文件,那么所有人可以用公钥来验证这个文件是被这个私钥签名过的,没有的私钥的人是不能进行签名的。
4.1.2 创建公钥签名的必要性
apt安全在下载release文件之前总是会下载release.gpg文档,如果不能下载release.gpg或者是签名错误,它会提示并会显示出relase文件指向的包文件,提示一个不被信任的源,看起来像下面这样:
W: GPG error: http://ftp.us.debian.org testing Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 010908312D230C5F
如果你忽视掉这个提醒,apt会再次提醒:
WARNING: The following packages cannot be authenticated! libglib-perl libgtk2-perl Install these packages without verification [y/N]?
keyring 整个系统的安全是围绕release.gpg文件展开的,apt会用gpg检查签名,为了检查签名,要用公钥去检查签名,这些key都保存在(/etc/apt/trusted.gpg)
$ sudo apt-key list
/etc/apt/trusted.gpg
pub 4096R/55BE302B 2009-01-27 [verfällt: 2012-12-31]
uid Debian Archive Automatic Signing Key (5.0/lenny) [email protected]
4.1.3 生成key
(1) 使用rng-tools产生大量随机操作
创建gpg key需要大量的随机操作,而且随着你选择的密钥长度的长短会耗费大量时间 采取下面的做法你会节省不少时间:
$ sudo apt-get install rng-tools
$ vim /etc/default/rng-tools
[...]
HRNGDEVICE=/dev/urandom
[...]
$ /etc/init.d/rng-tools start
(2)创建gpg key
$ gpg --gen-key
选择4 RSA
长度为 4096(长点好)
0 (key does not expire)
Real name:mr-zhao
Email add: [email protected]
commnet: debian package
Enter passphrase:****
(3) 常用命令
$ gpg --list-keys ||--list-secret-keys #查看公私钥的keyid
$ gpg --export -a "user_name" >public.key #导出公钥
$ gpg --export-secret-key -a "User Name" > private.key #导出私钥匙
$ gpg --allow-secret-key-import --import private.key #导入私钥
4.2 Reprepo 创建本地仓库
搭建一个本地源,需要有索引文件Package.gz,目录pool下面放入软件包 ,生成release文件,对Release文件进行签名生成的Release.gpg,而且每次在签名 的时候都要输入短密钥,这太繁琐了,在移除某个软件包的时候,同样又要重复一样的步骤浪费了很多的时间,使用gpg-agent和reprepro工具可以很好解决输入短密钥和代码发布和 移除的问题
gpg-agent install
$ apt-get install gnupg-agent
add this to you bashrc profile
if test -f $HOME/.gpg-agent-info && kill -0 `cut -d: -f 2 $HOME/.gpg-agent-info` 2>/dev/null; then GPG_AGENT_INFO=`cat $HOME/.gpg-agent-info` export GPG_AGENT_INFO else eval `gpg-agent --daemon` echo $GPG_AGENT_INFO >$HOME/.gpg-agent-info fi GPG_TTY=`tty` export GPG_TTY --- $ source $HOME/.bashrc
使用reprepro触发gpg-agent的时候输入短密钥后过不久又要求输入短密钥,这是因为 gpg-agent记录的短密钥过期了,解决办法如下:
cat ~/.gnupg/gpg-agent.conf
max-cache-ttl 60480000
default-cache-ttl 60480000 将记录的短密钥周期设置为最大值
安装Reprepo并生成key
$ sudo apt-get install reprepro gnupg $ gpg --gen-key //生成key需要大量的随机操作 $ sudo gpg --list-keys
创建一个包仓库并导出key
$ sudo su # cd /data/mirror # mkdir my-ubuntu # mkdir -p ./my-ubuntu/conf # gpg --armor --export mr-zhao [email protected] >> /data/mirror/my-ubuntu/public.key # vi /data/mirror/my-ubuntu/conf/distributions //文件关于Release 载入的基本信息 Origin: (yourname) Label: (name of repository) Suite: (stable or unstable) Codename: (the codename for the distribution you are using, like trusty) Version: (the version for the distribution you are using, like 14.04) Architectures: (the repository packages architecture, like i386 or amd64) Components: (main restricted universe multiverse) Description: (Some information about the repository) SignWith: yes --- 一个distribution实例: Origin: ubuntu-Mike Label: ubuntu-Mike Suite: precise Codename: precise Version: 12.04 Architectures: amd64 i386 Components: main restricted multiverse universe Description: private main deb repository for precise SignWith: default Origin: ubuntu-Mike Label: ubuntu-Mike Suite: trusty Codename: trusty Version: 14.04 Architectures: amd64 i386 Components: main restricted multiverse universe Description: private main deb repository for trusty SignWith: default --- # vi /data/mirror/my-ubuntu/conf/options //reprepro --options命令的集合 verbose basedir . ask-passphrase distdir /data/mirror/my-ubuntu/repos/dists //dist文件的输出位置 outdir /data/mirror/my-ubuntu/repos //pool输出的位置
创建仓库目录树
# reprepro --ask-passphrase -Vb /data/mirror/my-ubuntu export
软件发布与移除
将自己打好的包添加到仓库(发布) # reprepro -b . -C main includedeb precise /home/mr-zhao/test/dante_1.3.2-1_amd64.deb //pool中就能找到这个包了 移除软件包 # reprepro remove precise dante
搭建自己的私有镜像
# cd /data/mirror/ # mkdir web # ln -s /data/mirror/ubuntu/repo/ /data/mirror/web/ubuntu # ln -s /data/mirror/my-ubuntu/repo/ /data/mirror/web/my-ubuntu 通过nginx发布,供客户端使用 vi /etc/nginx/sites-enabled/mirror.conf server { listen 80; server_name _; root /data/mirror/web; autoindex on; }
启动nginx,打开浏览器测试:
后续就可以把该本地镜像添加到 /etc/apt/sources.list就可以使用了。
- 推荐阅读