2010-02-22 17 views
8

Estamos creando una aplicación utilizando PHP y utilizando algunos servicios de terceros que requieren una clave API secreta. Tenemos un archivo PHP que contiene todas las definiciones de claves que luego importamos (utilizando require_once) cuando sea necesario.Almacenamiento de claves secretas importantes en archivos php

¿Es seguro este enfoque? ¿Deberíamos almacenar las llaves en un lugar diferente?

Gracias.

Respuesta

13

Something similar se solicitó hoy un script de shell. La respuesta también es válida aquí: asegúrese de guardar el archivo fuera de la raíz web o, si eso no es posible, protéjalo utilizando un archivo .htaccess.

También me gusta unset() cualquier variable que contenga datos confidenciales después del uso, por lo que ni siquiera un volcado variable completo (por ejemplo, en un mensaje de depuración) más adelante en ese script podría revelarlo.

+4

+1 para desarmar las variables una vez que no son necesarias. Lo hago con mis contraseñas de base de datos. – MitMaro

+0

Esta es una gran respuesta, gracias. – DiogoNeves

+0

Ahora que lo pienso, ¿podría dejar las claves en el mismo lugar (con mejores configuraciones de permisos) pero encriptarlas, poniendo solo la clave de cifrado fuera del alcance de la raíz web? De esa manera podríamos leer el archivo en tantas máquinas como necesitemos tan pronto como las configuremos nosotros mismos con nuestra clave? Gracias de nuevo. – DiogoNeves

3

Debe ser relativamente seguro siempre que no se pueda acceder al archivo desde la web. Muchos sitios colocarán archivos confidenciales fuera del webroot en el servidor, y simplemente los incluirán cuando sea necesario en su aplicación.

3

Siempre establezco los permisos de los certificados y otros archivos que contienen datos confidenciales de modo que solo mi equipo de desarrollo y el servicio apache puedan acceder al archivo. Esto es importante si está utilizando un servidor compartido por una organización grande, como una universidad, donde muchas personas pueden tener permisos para el archivo de forma predeterminada. A menudo he visto permisos de lectura para todos, para que el servidor web pueda acceder al archivo (ya que no es el propietario ni el permiso del grupo para el archivo, lo único que queda es dar lectura a "otro").

En su lugar, me aseguro de que haya un grupo que solo contenga mi equipo de desarrollo y establezco los permisos de lectura/escritura para el archivo en ese grupo. Luego uso ACL para agregar un permiso de lectura para el servicio APACHE. Debe usar una ACL ya que el propietario y el grupo normalmente se configuran como un desarrollador y un grupo de equipo de desarrollo, dejándole sin opciones para establecer el acceso de apache que no sea el uso de ACL.

+1

+1 Buenos puntos para trabajar en servidores compartidos: a menudo se le escapa la idea de que un 'chmod 777' significa que todos los vecinos pueden acceder al archivo también. –

+0

Ahora que lo pienso, ¿podría dejar las claves en el mismo lugar (con mejores configuraciones de permisos) pero encriptarlas, poniendo solo la clave de cifrado fuera del alcance de la raíz web? De esa forma, podríamos leer el archivo en tantas máquinas como necesitemos tan pronto como las configuremos nosotros mismos con nuestra clave. Gracias. – DiogoNeves

0

de Seguridad por la ofuscación:

  1. crear propio espacio de nombres con la función para codificar, decodificar
  2. añadir auto_prepend_file en php.ini a /usr/share/nginx/outsidehtml/keystorage/83738489384828838227.php
  3. ejecutar nginx o apache en chroot, selinux
  4. desactivar el permiso de listado de la carpeta keystorage setfacl -m user:nginx:x /usr/share/nginx/outsidehtml/keystorage/
  5. añadir php.ini disable_class = ReflectionFunction disable_function = opcache_get_status, phpinfo, show_source, ini_get
  6. Para una mejor Harding se puede almacenar como clave en php.ini es decir, valor 123key = secret64

PRUEBA

print_r(glob('/usr/share/nginx/outsidehtml/keystorage/*.*')); 
Cuestiones relacionadas