Ansible:如何将存储库克隆为其他用户

时间:2015-07-26 18:44:48

标签: git ansible ansible-playbook

我正在尝试使用Ansible编写部署规则。一些步骤是:

  1. 更新和升级服务器
  2. 创建名为harry的用户
  3. 将公钥和私钥添加到哈里
  4. 从bitbucket.org克隆一个Git存储库
  5. 我想在其主目录中将存储库克隆为harry用户(这就是我复制它的公钥和私钥的原因)。问题是无法指定用户必须执行git clone。所以Ansible尝试以root身份克隆存储库并失败,因为他没有访问存储库的权限。

    你是如何解决这个问题的?

5 个答案:

答案 0 :(得分:19)

根据Ansible关于Privilege Escalation的文档,Ansible在成为无特权用户方面存在局限性,因为它向Harry公开了一个安全漏洞。

使用Ansible git模块,您可以使用key_file参数指定使用来自特权Ansible用户的Harry私钥,并使用become_user允许克隆文件获得所有权对哈利例如:

- name: Clone bitbucket repo
  git:
    repo: git@bitbucket.org:your-repo.git
    dest: /var/www/
    version: master
    accept_hostkey: yes
    key_file: /home/harry/.ssh/id_rsa
  become_user: harry

答案 1 :(得分:6)

您可以为游戏手册中的每个任务指定用户:

- name: Clone bitbucket repo
  git: ...
  become: yes
  become_user: harry

有关详细信息,请参阅Ansible Privilege Escalation

将私钥放在远程服务器上的一种更安全的替代方法是在服务器上的sshd配置和本地ssh配置中启用ssh密钥转发。然后钥匙永远不会离开你当地的盒子。

答案 2 :(得分:1)

是的,您可以使其与ssh转发配合使用

只要您成为git克隆的用户是sudoers的一部分,那么他就不需要使用sudo来执行git

因此,除了密钥转发所需的所有配置之外,Ansible文档中甚至提到了一个技巧。 高级过程如下: 在控制机器中启用代理转发 在目标机器上启用接受代理密钥 创建一个用户并将其(或她:)添加到sudoers组中 使用ansible的git模块克隆仓库,成为:your-sudoer-user

此外,为避免主机上的任何权限被拒绝,只需将其克隆到〜/ something 您随时可以将其复制或符号链接到您想要的任何地方

这是显示将用户添加到sudoers的剧本部分的链接,它基本上是一个复制粘贴:Ansible: create a user with sudo privileges

像魅力一样工作

此外,请确保在BitBucket的常规设置中(而不是在每个项目中)添加SSH公钥。否则,您的ssh密钥将仅适用于一个特定的存储库。但是,如果您在bitbucket常规设置中添加ssh密钥,它将在您的所有存储库上正常工作

下面是使其工作的代码,suduer用户为“部署者”

# the tasks to CREATE A SUDOER GROUP


- name: Make sure we have a 'wheel' group
    group:
      name: wheel
      state: present
    become: yes

  - name: Allow 'wheel' group to have passwordless sudo
    lineinfile:
      dest: /etc/sudoers
      state: present
      regexp: '^%wheel'
      line: '%wheel ALL=(ALL) NOPASSWD: ALL'
      validate: 'visudo -cf %s'
    become: yes

  - name: Add sudoers users to wheel group
    user: name=deployer groups=wheel append=yes state=present createhome=yes
    become: yes


 # tasks to ADD REPO with Ansible's GIT MODULE
  - name: Add  Git Repo - BitBucket 
    git:
      repo: 'git@bitbucket.org:<your_username>/<your_repo>.git'
      dest: ~/code  # note this destination, you will avoid permissions issues
      accept_hostkey: yes # btw, this is for the ssh key forwarding
      recursive: no
    become: deployer # this guy (or gal) is a sudoer by now

#额外的“ hack”可一次性更改文件和文件夹的权限,这与Capital X以及它适用于什么以及与否有关。也从另一个stackoverflow中提取

- name: Set perms on new Code repo to deployer:deployer dirs-0755 and files-0644
    file:
      path: ~/code
      state: directory
      owner: deployer 
      group: deployer 
      mode: u=rwX,g=rX,o=rX
      recurse: yes
    become: yes

答案 3 :(得分:0)

我们可以简单地使ssh访问用户 harry (在我的示例中为www-data),并具有与 root 相同的authorized_key。这不是安全问题,如果可以连接到 root ,则可以执行任何其他操作,而如果您以 harry 进行连接。

remote_user: root
tasks:
  - name: Create /var/www/.ssh
    file:
      state: directory
      owner: www-data
      group: www-data
      path: /var/www/.ssh
      mode: 0700

  - name: Copy authorized_keys to www-data
    copy:
      remote_src: yes
      src: ~/.ssh/authorized_keys
      dest: /var/www/.ssh/
      mode: 0400
      owner: www-data

  - name: Ensure www-data has shell
    lineinfile:
      path: /etc/passwd
      regexp: '^www-data:'
      line: 'www-data:x:33:33:www-data:/var/www:/bin/bash'

  - name: chown -R www-data /var/www
    file:
      owner: www-data
      path: /var/www
      recurse: yes

  - name: Git checkout application
    git:
      repo: git@gitlab.com:harry/project.git
      dest: "/var/www/project_root_dir"
      accept_hostkey: yes
    remote_user: www-data

答案 4 :(得分:-1)

是的,使用ssh转发可以正常工作。 如果您的剧本已全局打开“成为:是”,请确保对git任务将其关闭。 当您“成为:是”时,它不起作用的原因是因为root特权升级破坏了ssh转发。 我认为您无需成为琐的人。因为如果您的Ansible控制机器使用ssh密钥通过Bitbucket进行了身份验证(您将ssh密钥添加到存储库中),则此身份验证将通过ssh转发进行传递。 您可以通过ssh到目标中并发出“ ssh -T git@bitbucket.org”来对其进行测试,您将在输出中看到Bitbucket接受目标作为Ansible控制机器的用户。因此,只需以明确的“成为:否”执行任务即可。 我同意克隆到目标附近。否则会引起权限问题。 [ 编辑: 还有一点要使它起作用-po Repo URL应该是ssh而不是https,而不是ssh://(尽管写了什么)在Ansible手册示例中)] 就安全性而言,如上所述,ssh转发是最好的。