A regra precisa é: você pode percorrer um diretório se e somente se tiver permissão de execução.
Por exemplo, para acessar dir/subdir/file
, você precisa de permissão de execução em dir
e dir/subdir
, além das permissões em file
para o tipo de acesso desejado. Entrando em casos de canto, não tenho certeza se é universal que você precise executar permissão no diretório atual para acessar um arquivo através de um caminho relativo (você faz no Linux).
A maneira como você acessa um arquivo é importante. Por exemplo, se você tiver permissões de execução em /foo/bar
, mas não em /foo
, mas seu diretório atual for /foo/bar
, será possível acessar arquivos em /foo/bar
por meio de um caminho relativo, mas não por um caminho absoluto. Você não pode mudar para /foo/bar
neste cenário; um processo mais privilegiado, presumivelmente, fez cd /foo/bar
antes de ficar sem privilégios. Se um arquivo tiver vários links físicos, o caminho usado para acessá-lo determinará suas restrições de acesso.
Links simbólicos não mudam nada. O kernel usa os direitos de acesso do processo de chamada para percorrê-los. Por exemplo, se sym
for um link simbólico para o diretório dir
, você precisará de permissão de execução em dir
para acessar sym/foo
. As permissões no symlink em si podem ou não importar, dependendo do SO e do sistema de arquivos (alguns os respeitam, alguns os ignoram).
A remoção da permissão de execução do diretório raiz restringe efetivamente um usuário a uma parte da árvore de diretórios (na qual um processo mais privilegiado deve ser alterado). Isso requer listas de controle de acesso para qualquer uso. Por exemplo, se /
e /home
estiverem fora dos limites para joe
( setfacl -m user:joe:0 / /home
) e /home/joe
for joe
, o joe
não conseguirá acessar o restante do sistema (incluindo a execução de scripts de shell com /bin/sh
ou binários vinculados dinamicamente que precisam acessar /lib
, então você precisa ir mais fundo para uso prático, por exemplo, setfacl -m user:joe:0 /*; setfacl -d user:joe /bin /lib
).
A permissão de leitura em um diretório dá o direito de enumerar as entradas. Dar permissão de execução sem permissão de leitura é útil ocasionalmente: os nomes das entradas servem como senhas para acessá-los. Eu não consigo pensar em qualquer uso em dar permissão de leitura ou gravação para um diretório sem permissão de execução.