Permissions

ansible 創建的文件似乎具有損壞的權限

  • October 1, 2014

Ansible 創建的文件存在問題

我正在考慮使用在新的 ISP 處設置一些新伺服器,並且我一直在做一些基本的步驟來首先進行測試。我是新手,但在另一個 ISP 的差異伺服器上做了一些測試,似乎一切正常(我在那裡創建了文件沒有問題)。兩者都是 Unbuntu 12,但最初的測試是在已經將其核心更新到 3.8.0-44-generic 並添加了其他維護的伺服器上進行的。這個新伺服器也是 Ubuntu 12,但來自 ISP 模板,使用核心 3.5(Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic x86_64))

我的第一個測試是創建新使用者並上傳他們已經存在的 SSH 密鑰以供將來登錄。使用者創建時沒有問題,文件創建在創建過程中沒有顯示任何錯誤,但是當我嘗試使用它們時確實如此。我嘗試使用密鑰登錄(新使用者)_,但係統表現得好像 SSH 密鑰文件不存在。由於這是我以 root 身份登錄的第一個新使用者,並以 root 身份進行了第一次查找和創建

作為根,一切看起來都很好。.ssh 目錄中的文件“authorized_keys”存在並且似乎具有正確的權限並且確實具有正確的內容。但是嘗試通過 SSH 登錄就像它不存在一樣。我退出 root 並以新使用者身份重新登錄(使用密碼,因為密鑰未被辨識)。我執行“ls -al”並查看 .ssh 目錄很好,但是執行“ls -al .ssh”以查看目錄中的“authorized_keys”文件給了我一個非常奇怪的結果。’ls’ 為目錄中的每個項目輸出“權限被拒絕”錯誤消息,然後顯示應該是命令結果,但是當文件名可見時,其他所有內容(權限、文件大小、使用者/組、日期)都是被問號代替。

首先作為使用者 - myusername

myusername@my-server:~$ ls -al .ssh
ls: cannot access .ssh/authorized_keys: Permission denied
ls: cannot access .ssh/..: Permission denied
ls: cannot access .ssh/.: Permission denied
total 0
d????????? ? ? ? ?            ? .
d????????? ? ? ? ?            ? ..
-????????? ? ? ? ?            ? authorized_keys
myusername@my-server:~$ 

現在作為根

sudo bash
[sudo] password for myusername:
root@my-server:~# sudo ls -al .ssh
total 12
drw-r--r-- 2 myusername myusername 4096 Sep 17 19:54 .
drwxr-xr-x 4 myusername myusername 4096 Sep 17 22:51 ..
-rw-r--r-- 1 myusername myusername  406 Sep 17 19:54 authorized_keys
root@my-server:~#

就文件而言,我的伺服器滿足最低要求(linux、SSH 和 Python)

規格是 - Ubuntu 12.04.2 LTS (GNU/Linux 3.5.0-23-generic x86_64)

ansible 版本是 1.7.1

我正在從我的 OSX (10.9.4) Python Python 2.7.5 筆記型電腦上執行 ansible 會話

下面是我為此執行的 Ansible Playbook

---
# This playbook create my user {{userid}} and loads the public ssh-key

- name: create my user {{userid}} and loads the public ssh-key  
 hosts: myservername-public 
#  gather_facts: no
#  remote_user: myusername
 vars:
#    security_groups: "sudo,adm"
   security_groups: ""
   userid: testjunk01
 tasks:
 - name: test connection
   ping:
   remote_user: myusername

 - name: Create user {{userid}} groups={{security_groups}} 
   user: name={{userid}} shell=/bin/bash groups={{security_groups}} append=yes 
     password=$hashed_password_was_here_and_it_worked

 - name: Verify that needed directories are in place before file copy 
   file: dest="/home/{{userid}}/.ssh"
         mode=0644
         owner={{userid}} group={{userid}} 
         state=directory

 - name: Copy file into user {{userid}}'s directory 
   copy: src="/Users/osx_user/Documents/Projects/Projects Internal/Security/ssh-key-public/myusername"
         dest="/home/{{userid}}/.ssh/authorized_keys"
         mode=0644
         owner={{userid}} group={{userid}} 
         backup=yes

 - name: Reset permissions for file after file copy 
   file: dest="/home/{{userid}}/.ssh/authorized_keys"
         mode=0644
         owner={{userid}} group={{userid}} 
         state=file

===== 剛剛升級到ansible 1.7.2 並再次嘗試。結果相同。下面執行

伺服器名稱和 IP 地址被屏蔽

$ ansible-playbook playbooks/test01/Test02/create-user -i  ansible-hosts --ask-pass -vv
SSH password:

PLAY [create my user testjunk01 and loads the public ssh-key] *****************

GATHERING FACTS ***************************************************************
<192..168.1.1> REMOTE_MODULE setup
ok: [myserver-public]

TASK: [test connection] *******************************************************
<192..168.1.1> REMOTE_MODULE ping
ok: [myserver-public] => {"changed": false, "ping": "pong"}

TASK: [Create user testjunk01 groups=] ****************************************
<192..168.1.1> REMOTE_MODULE user name=testjunk01 shell=/bin/bash groups= append=yes password=VALUE_HIDDEN
ok: [myserver-public] => {"append": true, "changed": false, "comment": "", "group": 1003, "groups": "", "home": "/home/testjunk01", "move_home": false, "name": "testjunk01", "password": "NOT_LOGGING_PASSWORD", "shell": "/bin/bash", "state": "present", "uid": 1003}

TASK: [Verify that needed directories are in place before file copy] **********
<192..168.1.1> REMOTE_MODULE file dest="/home/testjunk01/.ssh" mode=0644 owner=testjunk01 group=testjunk01 state=directory
changed: [myserver-public] => {"changed": true, "gid": 1003, "group": "testjunk01", "mode": "0644", "owner": "testjunk01", "path": "/home/testjunk01/.ssh", "size": 4096, "state": "directory", "uid": 1003}

TASK: [Copy file into user testjunk01's directory] ****************************
changed: [myserver-public] => {"changed": true, "dest": "/home/testjunk01/.ssh/authorized_keys", "gid": 1003, "group": "testjunk01", "md5sum": "fd6c6017993e847026a010bf67a96c1a", "mode": "0644", "owner": "testjunk01", "size": 406, "src": "/root/.ansible/tmp/ansible-tmp-1412114658.34-25330110994991/source", "state": "file", "uid": 1003}

TASK: [Reset permissions for file after file copy] ****************************
<192..168.1.1> REMOTE_MODULE file dest="/home/testjunk01/.ssh/authorized_keys" mode=0644 owner=testjunk01 group=testjunk01 state=file
ok: [myserver-public] => {"changed": false, "gid": 1003, "group": "testjunk01", "mode": "0644", "owner": "testjunk01", "path": "/home/testjunk01/.ssh/authorized_keys", "size": 406, "state": "file", "uid": 1003}

PLAY RECAP ********************************************************************
myserver-public         : ok=6    changed=2    unreachable=0    failed=0

您引用的第一個ls是當您嘗試訪問ls -l您有r權限但沒有x權限的目錄時會發生什麼。目錄上的r位使您能夠呼叫readdir它,因此您可以獲得其中的文件名,但如果沒有,x您將無法stat找到ls -l通常列印的所有其他資訊。

ls告訴您無法通過Permission denied錯誤消息和充滿問號的欄位獲取資訊。

第二個ls用這條線確認診斷:

drw-r--r-- 2 myusername myusername 4096 Sep 17 19:54 .

使用者myusername有讀權限,但沒有執行權限。您可能想要u+xa+x該目錄。

我從您的文章中學到的一件有趣的事情是r-without-x現在提供的資訊比以前稍微多…您可以在原始列表中看到它authorized_keys是一個正常文件並且...目錄(第一列d-.)。在較舊的 Unix/Linux 系統上,第一列也是一個問號!現在readdir返回文件類型資訊作為獎勵,因此您無需stating 即可獲得它。

…我略略略過了你問題的後半部分,因為我以前從未見過那些東西,但這看起來像是罪魁禍首

file: dest="/home/{{userid}}/.ssh"
     mode=0644

我希望.ssh目錄0700正常。並且裡面的文件是0600. 這是一個您真的不希望其他使用者徘徊的區域。無論如何,它至少需要0500ls -l所有者正常執行。

引用自:https://serverfault.com/questions/632532