262

I'm working to set up Panda on an Amazon EC2 instance. I set up my account and tools last night and had no problem using SSH to interact with my own personal instance, but right now I'm not being allowed permission into Panda's EC2 instance. Getting Started with Panda

I'm getting the following error:

@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @

Permissions 0644 for '~/.ec2/id_rsa-gsg-keypair' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.

I've chmoded my keypair to 600 in order to get into my personal instance last night, and experimented at length setting the permissions to 0 and even generating new key strings, but nothing seems to be working.

Any help at all would be a great help!


Hm, it seems as though unless permissions are set to 777 on the directory, the ec2-run-instances script is unable to find my keyfiles.

3
  • ec2-run-instances should only require a keypair name, which is something that lives on Amazon's side. You only should be using your actual private key (the one on disk) when you SSH in. What error are you getting from ec2-run-instances?
    – user27619
    Commented Oct 30, 2008 at 23:30
  • Are you sure you set it to 0600 (octal), and not 600 (decimal)?
    – hyde
    Commented Feb 28, 2013 at 8:07
  • 13
    chmod 400 ~/.ssh/id_rsa Reference: stackoverflow.com/a/9270753/2082569
    – atulkhatri
    Commented Feb 6, 2015 at 5:33

15 Answers 15

257

I've chmoded my keypair to 600 in order to get into my personal instance last night,

And this is the way it is supposed to be.

From the EC2 documentation we have "If you're using OpenSSH (or any reasonably paranoid SSH client) then you'll probably need to set the permissions of this file so that it's only readable by you." The Panda documentation you link to links to Amazon's documentation but really doesn't convey how important it all is.

The idea is that the key pair files are like passwords and need to be protected. So, the ssh client you are using requires that those files be secured and that only your account can read them.

Setting the directory to 700 really should be enough, but 777 is not going to hurt as long as the files are 600.

Any problems you are having are client side, so be sure to include local OS information with any follow up questions!

6
  • 3
    I just got into a situation today where I WANT the keyfile to be group-readable (using ssh not for personal login, but to execute a script on a remote server, dedicated user on the remote server for this purpose, authorized_keys locked down so only said script will run, and multiple persons on the origin server should have access to run the script). Oh well, I guess the simple workaround is to put copies into ~/.ssh/ for all users that should have access - or populate authorized_keys with all the personal keys.
    – tobixen
    Commented May 8, 2014 at 11:23
  • @tobixen: Two years coming, but...the 'correct' workaround would be to place the key in a dedicated user, and allow the group users sudo access to running that command as the dedicated user. Commented Apr 7, 2016 at 14:49
  • @StuThompson link to EC2 documentation seems to be dead. Can you please update? Commented Jun 20, 2016 at 12:49
  • I cant see what shuld I do to make it work in your answer, Please provide answer :) Commented Dec 17, 2019 at 6:00
  • 1
    @Pratik setting 600 for both key files and 777 for the directory should work.
    – Jamo
    Commented Jun 14, 2020 at 18:42
83

Make sure that the directory containing the private key files is set to 700

chmod 700 ~/.ec2
4
  • 1
    Any special reason why you want to have execution privileges on the file?
    – Zoltán
    Commented Oct 7, 2015 at 7:53
  • 2
    @Zoltán it's a directory, not a file.
    – avmohan
    Commented Mar 26, 2016 at 12:04
  • 3
    I just used this on the .pem file and it worked for me. Commented Jul 3, 2017 at 18:42
  • @Zoltán I think in the directory, "execution" privilege is for ls (list command)
    – Ben L
    Commented Mar 8, 2023 at 21:39
59

To fix this,

  1. you’ll need to reset the permissions back to default:

    sudo chmod 600 ~/.ssh/id_rsa
    sudo chmod 600 ~/.ssh/id_rsa.pub
    

    If you are getting another error:

    • Are you sure you want to continue connecting (yes/no)? yes
    • Failed to add the host to the list of known hosts (/home/geek/.ssh/known_hosts).
  2. This means that the permissions on that file are also set incorrectly, and can be adjusted with this:

    sudo chmod 644 ~/.ssh/known_hosts
    
  1. Finally, you may need to adjust the directory permissions as well:

    sudo chmod 755 ~/.ssh
    

This should get you back up and running.

32

I also got the same issue, but I fix it by changing my key file permission to 600.

sudo chmod 600 /path/to/my/key.pem

1
  • sudo is not a recognized command in windows?
    – rishi jain
    Commented Feb 26, 2023 at 16:35
23

The private key file should be protected. In my case i have been using the public_key authentication for a long time and i used to set the permission as 600 (rw- --- ---) for private key and 644 (rw- r-- r--) and for the .ssh folder in the home folder you will have 700 permission (rwx --- ---). For setting this go to the user's home folder and run the following command


Set the 700 permission for .ssh folder

chmod 700 .ssh


Set the 600 permission for private key file

chmod 600 .ssh/id_rsa


Set 644 permission for public key file

chmod 644 .ssh/id_rsa.pub
9

Change the File Permission using chmod command

sudo chmod 700 keyfile.pem
1
  • Please use the sudo when it necessary.
    – Raja Simon
    Commented Mar 27, 2021 at 3:24
8

On windows, Try using git bash and use your Linux commands there. Easy approach

chmod 400 *****.pem

ssh -i "******.pem" [email protected]
1
  • If using WSL, make sure you copy the pem file to the a Linux folder because chmod won't be effective in the /mnt dirs. Commented Feb 4, 2020 at 18:15
3

Keep your private key, public key, known_hosts in same directory and try login as below:

ssh -I(small i) "hi.pem" ec2-user@ec2-**-***-**-***.us-west-2.compute.amazonaws.com
  • Same directory in the sense, cd /Users/prince/Desktop. Now type ls command and you should see **.pem **.ppk known_hosts

Note: You have to try to login from the same directory or you'll get a permission denied error as it can't find the .pem file from your present directory.


If you want to be able to SSH from any directory, you can add the following to you ~/.ssh/config file...

Host your.server
HostName ec2-user@ec2-**-***-**-***.us-west-2.compute.amazonaws.com
User ec2-user
IdentityFile ~/.ec2/id_rsa-gsg-keypair
IdentitiesOnly yes

Now you can SSH to your server regardless of where the directory is by simply typing ssh your.server (or whatever name you place after "Host").

2

In my case, I put that file in the downloads folder, and this works.

re-run the command.

ssh -i /path/to/keyfile.pem user@some-host

Or follow this https://99robots.com/how-to-fix-permission-error-ssh-amazon-ec2-instance/

1
1

Just to brief the issue, that pem files permissions are open for every user on machine i.e any one can read and write on that file On windows it difficult to do chmod the way I found was using a git bash. I have followed below steps

  1. Remove user permissions

    chmod ugo-rwx abc.pem

  2. Add permission only for that user

    chmod u+rw

  3. run chmod 400

    chmod 400 abc.pem

4.Now try ssh -i for your instance

0
1
sudo chmod 700 ~/.ssh 
sudo chmod 600 ~/.ssh/id_rsa
sudo chmod 600 ~/.ssh/id_rsa.pub

The above 3 commands should solve the problem!

0

I am thinking about something else, if you are trying to login with a different username that doesn't exist this is the message you will get.

So I assume you may be trying to ssh with ec2-user but I recall recently most of centos AMIs for example are using centos user instead of ec2-user

so if you are ssh -i file.pem centos@public_IP please tell me you aretrying to ssh with the right user name otherwise this may be a strong reason of you see such error message even with the right permissions on your ~/.ssh/id_rsa or file.pem

0

The solution is to make it readable only by the owner of the file, i.e. the last two digits of the octal mode representation should be zero (e.g. mode 0400).

OpenSSH checks this in authfile.c, in a function named sshkey_perm_ok:

/*
 * if a key owned by the user is accessed, then we check the
 * permissions of the file. if the key owned by a different user,
 * then we don't care.
 */
if ((st.st_uid == getuid()) && (st.st_mode & 077) != 0) {
    error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
    error("@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @");
    error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
    error("Permissions 0%3.3o for '%s' are too open.",
        (u_int)st.st_mode & 0777, filename);
    error("It is required that your private key files are NOT accessible by others.");
    error("This private key will be ignored.");
    return SSH_ERR_KEY_BAD_PERMISSIONS;
}

See the first line after the comment: it does a "bitwise and" against the mode of the file, selecting all bits in the last two octal digits (since 07 is octal for 0b111, where each bit stands for r/w/x, respectively).

0

On Windows, I couldn't make it work with chmod through WSL and git bash so I went through the proper channel and it actually worked:

  1. Go to the file's Properties dialog (Alt + Enter or right click -> Properties).
  2. Choose Security tab
  3. Click Advanced.

enter image description here

  1. You probably need to click Disable Inheritance to delete everything.
  2. Click Add then Select a Principal. You may need to click Advanced and search for your user name (should be the same as Owner in the previous dialog).
  3. Give yourself Full control. Click Ok to until done.

enter image description here

  1. You should now be able to use the file for ssh.
-1

Just a note for anyone who stumbles upon this:

If you are trying to SSH with a key that has been shared with you, for example:

ssh -i /path/to/keyfile.pem user@some-host

Where keyfile.pem is the private/public key shared with you and you're using it to connect, make sure you save it into ~/.ssh/ and chmod 777.

Trying to use the file when it was saved elsewhere on my machine was giving the OP's error. Not sure if it is directly related.

Not the answer you're looking for? Browse other questions tagged or ask your own question.