assistant: Ensure that .ssh/config and .ssh/authorized_keys are not group or world writable when writing to those files, as that can make ssh refuse to use them, if it allows another user to write to them.

This commit is contained in:
Joey Hess 2014-01-03 17:44:12 -04:00
parent 18331b7235
commit fdcc04096c
4 changed files with 30 additions and 3 deletions

View file

@ -149,7 +149,7 @@ removeAuthorizedKeys gitannexshellonly dir pubkey = do
sshdir <- sshDir sshdir <- sshDir
let keyfile = sshdir </> "authorized_keys" let keyfile = sshdir </> "authorized_keys"
ls <- lines <$> readFileStrict keyfile ls <- lines <$> readFileStrict keyfile
writeFile keyfile $ unlines $ filter (/= keyline) ls viaTmp writeSshConfig keyfile $ unlines $ filter (/= keyline) ls
{- Implemented as a shell command, so it can be run on remote servers over {- Implemented as a shell command, so it can be run on remote servers over
- ssh. - ssh.
@ -290,13 +290,15 @@ setSshConfig sshdata config = do
sshdir <- sshDir sshdir <- sshDir
createDirectoryIfMissing True sshdir createDirectoryIfMissing True sshdir
let configfile = sshdir </> "config" let configfile = sshdir </> "config"
unlessM (catchBoolIO $ isInfixOf mangledhost <$> readFile configfile) $ unlessM (catchBoolIO $ isInfixOf mangledhost <$> readFile configfile) $ do
appendFile configfile $ unlines $ appendFile configfile $ unlines $
[ "" [ ""
, "# Added automatically by git-annex" , "# Added automatically by git-annex"
, "Host " ++ mangledhost , "Host " ++ mangledhost
] ++ map (\(k, v) -> "\t" ++ k ++ " " ++ v) ] ++ map (\(k, v) -> "\t" ++ k ++ " " ++ v)
(settings ++ config) (settings ++ config)
setSshConfigMode configfile
return $ sshdata { sshHostName = T.pack mangledhost } return $ sshdata { sshHostName = T.pack mangledhost }
where where
mangledhost = mangleSshHostName sshdata mangledhost = mangleSshHostName sshdata

View file

@ -10,6 +10,7 @@ module Utility.SshConfig where
import Common import Common
import Utility.UserInfo import Utility.UserInfo
import Utility.Tmp import Utility.Tmp
import Utility.FileMode
import Data.Char import Data.Char
import Data.Ord import Data.Ord
@ -117,7 +118,19 @@ changeUserSshConfig modifier = do
c <- readFileStrict configfile c <- readFileStrict configfile
let c' = modifier c let c' = modifier c
when (c /= c') $ when (c /= c') $
viaTmp writeFile configfile c' viaTmp writeSshConfig configfile c'
writeSshConfig :: FilePath -> String -> IO ()
writeSshConfig f s = do
writeFile f s
setSshConfigMode f
{- Ensure that the ssh config file lacks any group or other write bits,
- since ssh is paranoid about not working if other users can write
- to one of its config files (.ssh/config and .ssh/authorized_keys) -}
setSshConfigMode :: FilePath -> IO ()
setSshConfigMode f = modifyFileMode f $
removeModes [groupWriteMode, otherWriteMode]
sshDir :: IO FilePath sshDir :: IO FilePath
sshDir = do sshDir = do

3
debian/changelog vendored
View file

@ -12,6 +12,9 @@ git-annex (5.20131231) UNRELEASED; urgency=medium
* Assistant: Remove stale MERGE_HEAD files in lockfile cleanup. * Assistant: Remove stale MERGE_HEAD files in lockfile cleanup.
* Remotes can now be made read-only, by setting remote.<name>.annex-readonly * Remotes can now be made read-only, by setting remote.<name>.annex-readonly
* wanted, schedule: Avoid printing "ok" after requested value. * wanted, schedule: Avoid printing "ok" after requested value.
* assistant: Ensure that .ssh/config and .ssh/authorized_keys are not
group or world writable when writing to those files, as that can make
ssh refuse to use them, if it allows another user to write to them.
-- Joey Hess <joeyh@debian.org> Tue, 31 Dec 2013 13:41:18 -0400 -- Joey Hess <joeyh@debian.org> Tue, 31 Dec 2013 13:41:18 -0400

View file

@ -9,3 +9,12 @@ Windows 7, git-annex version 5.20131230-g192d991
### Please provide any additional information below. ### Please provide any additional information below.
I have no daemon.log, and the console log isn't particularly detailed today; it had just created an ssh key and shown it's fingerprint. I have no daemon.log, and the console log isn't particularly detailed today; it had just created an ssh key and shown it's fingerprint.
> Ok, I guess this is ssh refusing to use a file that has a group
> write bit set (when the owner is not the only member of its group),
> or perhaps that has the world write bit set.
>
> I have made the assistant unset those modes when creating and modifying
> ssh config files. Hopefully that is enough for Windows too.. I can't
> really test it there, but am calling this provisionally [[done]].
> --[[Joey]]