我正在尝试使用Ansible编写部署规则。一些步骤是:
我想在其主目录中将存储库克隆为harry
用户(这就是我复制它的公钥和私钥的原因)。问题是无法指定用户必须执行git clone。所以Ansible尝试以root身份克隆存储库并失败,因为他没有访问存储库的权限。
你是如何解决这个问题的?
答案 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转发是最好的。