私有镜像部署

有了本地镜像和自定义的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就可以使用了。

  • 推荐阅读

Create A .deb Package Repository

wiki reprepro

debian-reprepro

gpg-cheat

secureApt