O rexistro medra ao engadir, pero non se pode recrear: revisa a ACL do directorio
Engadir a un ficheiro non necesita un nome novo no seu directorio; crealo si. Compara a ACL de acceso cos valores herdados antes de ampliar nada.
Un rexistro que non deixa de medrar deixa de medrar no momento en que algo o volve crear, e o erro di permiso denegado. A conclusión tentadora é que o propio ficheiro necesita máis permisos, aínda que pode que a mesma conta xa poida escribilo. Engadir a un nome existente e crear un novo son comprobacións distintas, e só a segunda consulta o directorio.
Engadir e crear son comprobacións distintas
Abrir un ficheiro existente para engadir require permiso de escritura sobre ese ficheiro e permiso de busca en cada directorio da súa ruta. Crear un ficheiro require escritura e busca no directorio que o contén, porque a operación engade un nome a ese directorio. Substituír un ficheiro mediante un renomeado toca ambos os directorios e as súas regras de sticky bit.
| Operation | What must permit it | Typical failure message |
|---|---|---|
| Append to an existing log | File write access, path traversal | Permission denied on the file |
| Create a missing log | Directory write and search access | Permission denied on the path |
| Rename a replacement into place | Both directories, plus sticky restrictions | Permission denied or operation not permitted |
Un descritor xa aberto engade un cuarto caso. Un proceso pode manter un identificador escribible aberto antes de perder privilexios e aínda así fallar ao reabrir a mesma ruta coa súa identidade posterior. Os engadidos correctos e a creación fallida poden ser certos á vez, para o mesmo proceso.
As ACL predeterminadas herdanse, non conceden
Unha entrada que comeza polo prefixo predeterminado describe o que os obxectos novos herdan do directorio. Non concede nada ao directorio en si e non repara a ACL dun ficheiro que xa existe.
namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log
Le as entradas de acceso por separado das predeterminadas e le a máscara. Unha entrada con nome que mostra dereitos plenos pode seguir limitada pola máscara, por iso o comentario de eficacia importa máis que as letras da primeira liña.
Usa a ruta resolta en lugar da ruta da configuración. Unha ligazón simbólica, un punto de montaxe ou un directorio rotado poden colocar o ficheiro real onde o permiso que concediches nunca chega. Percorre a ruta primeiro con namei e despois compara cada nivel coa conta en cuestión. Adiviñar o directorio de nivel superior é como unha corrección aterra un nivel demasiado arriba.
Identifica quen escribe nese momento
Revisa a unidade de servizo, os seus drop-ins e a configuración de conta do propio demonio antes de cambiar nada. O proceso que engade e o que recrea poden ser distintos: un axudante de rotación, un escritor de estado e un lector web raramente comparten identidade.
Unha execución de proba desde un shell de root non reproduce un servizo restrinxido, e terá éxito mentres o servizo segue fallando. Reproduce a operación que falla na mesma unidade, coa mesma conta e os mesmos axustes de sandbox. Se non podes, arrinca a unidade cun shell temporal e comproba a identidade que informa. Calquera outra cousa mide o teu terminal en lugar do servizo.
Se de verdade fai falta crear, concede ao escritor acceso ao directorio de rexistro dedicado e mantén separado o acceso de lectura para os consumidores. Facer escribible unha conta compartida ou toda unha árbore de aplicación para satisfacer unha soa chamada de rexistro cambia un problema pequeno por un grande.
Rota sen reintroducir o fallo
Quen recrea o ficheiro decide o seu propietario e o seu modo para o seguinte ciclo, así que coordina a corrección coa configuración de rotación. Un substituto creado con outra conta ou cunha ACL nova devolve o fallo despois dunha corrección exitosa.
Fixa o modo e o grupo ao crear, non despois, e verifica a seguinte rotación en lugar do seguinte engadido. Un engadido só repite a proba que xa pasou. Se a ferramenta de rotación ofrece un axuste de modo de creación, úsao en vez dun chmod posterior. O oco entre a creación e o chmod é xusto cando pode fallar a seguinte escritura.
Cando o truncado falla de todos os xeitos, deixa de engadir permisos
Un fallo ao truncar un ficheiro no que podes escribir non se explica polos permisos do directorio, e engadir máis deles non axudará. Mira mellor os atributos e o confinamento: un atributo de só engadir permite escrituras só en modo de engadido, e unha montaxe de só lectura ou un sandbox de servizo poden denegar unha operación que a ACL permite.
Revisa as restricións de sistema de ficheiros da unidade e as opcións de montaxe da ruta, e despois reproduce a operación exacta que fallou. Ampliar un permiso que nunca se consultou só oculta que restrición era a real. Quita unha restrición cada vez nunha unidade desbotable e revírtea antes de cambiar algo permanente.