Dues receptes de mínim privilegi enganxades juntes no produeixen un desplegament més estricte. Un model deixa que el dimoni arrenqui amb privilegis i baixi a un compte sense privilegis després de la inicialització; l'altre fa que el gestor de serveis el llanci amb una identitat restringida des de la primera instrucció. Cada un funciona sol, i la combinació sovint produeix un servei que no pot fer netament cap de les dues feines. La resta d'això recorre la decisió per ordre.

Dos models, un sol amo del canvi

El primer model pertany al dimoni. Les opcions OpenVPN de la comunitat user i group canvien la identitat després que el túnel i les claus estiguin configurats, i persist-key més persist-tun mantenen aquests recursos utilitzables després.

El segon model pertany al gestor de serveis. Un paràmetre systemd User= o Group= decideix la identitat amb què arrenca el procés, i les directives de capacitats decideixen què pot retenir. Triar entre els models és una qüestió d'empaquetament abans que de seguretat, i el mantenidor del paquet ja hi ha respost. La vostra feina és trobar aquesta resposta en lloc d'inventar una tercera opció.

Tots dos són legítims. L'error és tractar-los com a capes d'un sol disseny, perquè el segon model pot convertir el canvi d'identitat del primer en una operació que el procés ja no té permís per fer.

Decidiu on canvia la identitat

Si la unitat ja arrenca com un compte dedicat, afegir una instrucció del dimoni per passar a un altre compte demana una transició setuid que un servei endurit mai no havia de fer. La fallada apareix com un error de permís a l'arrencada en lloc d'un missatge de política clar. Es llegeix com una capacitat que falta, cosa que empeny la gent cap a un conjunt de límits més ampli en lloc de cap a la qüestió de la identitat.

Llegiu què lliura realment el paquet instal·lat abans d'editar res, inclòs el seu directori drop-in. Algunes unitats ometen deliberadament la baixada pròpia del dimoni perquè el gestor ja se n'encarrega, i algunes es basen en aquestes opcions per al canvi posterior a la inicialització. Treure qualsevol de les dues sense saber quin model heu heretat és com un servei que funciona deixa d'arrencar.

Escriviu el model triat en una línia: propietat del gestor o propietat del dimoni. Cada directiva posterior ha de ser coherent amb aquesta frase, i una unitat mixta s'ha de tractar com un error i no com un compromís.

Les capacitats són límits, no concessions

Un conjunt de límits de capacitats diu què pot retenir un procés com a màxim. És un sostre, i llistar-hi una capacitat no concedeix res per si sol, i per això una unitat amb un conjunt de límits generós pot encara no aconseguir crear un túnel.

El que de fet col·loca una capacitat al conjunt ambiental d'un servei és AmbientCapabilities=. La referència d'execució de systemd documenta les dues directives per separat, i aquesta distinció explica la major part dels consells confusos sobre capacitats que hi ha en línia.

Afegiu una capacitat només després que l'operació que falla la identifiqui. Un conjunt de límits més ampli amaga la causa real i deixa el servei més privilegiat del que el disseny pretenia. També fa la unitat més difícil de revisar, perquè el sostre ja no descriu la feina. Traieu la capacitat extra un cop el defecte real estigui arreglat.

Mapifiqueu l'autoritat durant el cicle de vida

Llisteu què ha de fer el procés a cada etapa: arrencada, estat estable, reautenticació i desmuntatge. Crear interfícies, canviar rutes, llegir una clau protegida i invocar un assistent no passen tots al mateix moment ni amb els mateixos requisits. Ordeneu la llista per etapa abans d'ordenar-la per capacitat.

Les opcions de persistència conserven recursos durant la renegociació, i no concedeixen permisos que mai no s'han tingut. Una clau que el procés no pot llegir a l'arrencada continuarà sent il·legible després, diguin el que diguin les banderes de persistència. Les banderes conserven el que ja funcionava.

Feu servir un compte dedicat en lloc d'un de compartit. El projecte OpenVPN adverteix contra el costum d'usar nobody com a exemple genèric, perquè altres serveis de l'amfitrió poden ja córrer amb aquest compte i l'aïllament que us penseu que teniu no hi és.

Funcions que canvien la càrrega local, com la descàrrega del canal de dades o una compilació que enllaça diferent, poden desplaçar quines operacions calen. Reviseu el mapa quan canviï el paquet, no només quan alguna cosa es trenqui.

Escriviu el pla i manteniu accés de recuperació

Un registre de desplegament hauria de nomenar el gestor, la identitat d'arrencada, la identitat estable prevista i cada concessió amb l'operació que la requereix. Aquest registre és el que fa revisable el canvi següent en lloc d'experimental.

Manteniu l'accés a la consola mentre editeu, perquè una unitat que falla a l'arrencada és difícil de reparar en remot. Proveu un reinici i un reinici complet abans de donar el canvi per acabat. Una unitat que sobreviu a un reinici encara pot fallar abans que la xarxa estigui enlairada.

L'èxit és un cicle de vida d'autoritat mínima entès, no un procés que resulta que corre amb un nom que no és root.

Articles relacionats