Primero, la razón de no seguridad:
Flujo de trabajo de cambio de contraseña
Las contraseñas cambian independientemente del código de la aplicación de software. Si un DBA cambia la contraseña de una base de datos, ¿tiene sentido que los desarrolladores tengan que actualizar el código, obtener una nueva compilación y lanzamiento para producción e intentar cronometrarlo todo? Las contraseñas son un artefacto de configuración en tiempo de ejecución, no un artefacto de desarrollo. Se deben inyectar a través de archivos de configuración, variables de entorno o cualquier paradigma de configuración que esté utilizando.
Ámbito de autorización
En general, los sistemas de control de versiones proporcionan control de autorización, de modo que solo los usuarios autorizados pueden acceder a él. Pero dentro de un repositorio, los permisos son generalmente de lectura / escritura, o de solo lectura, o posiblemente algunas campanas y silbidos como GitHub proporciona. Es poco probable que encuentre restricciones de seguridad que permitan a los desarrolladores obtener el código fuente, pero las contraseñas no . Si puede clonar un repositorio, puede clonar un repositorio. Período. En muchos entornos, los desarrolladores no tienen acceso completo a la producción. A veces tienen acceso de solo lectura a bases de datos de producción, a veces no tienen acceso. ¿Qué sucede si los desarrolladores generalmente tienen acceso, pero no quiere que todos los internos, nuevas contrataciones, etc. tengan acceso?
Environments
¿Qué sucede si tiene varios entornos, como un entorno de desarrollo, un entorno de control de calidad, una puesta en escena y producción? ¿Almacenarías todas sus contraseñas en el control de versiones? ¿Cómo sabría la aplicación cuál usar? La aplicación debería tener una forma de conocer el entorno, lo que terminaría siendo un ajuste de configuración. Si puede hacer del nombre del entorno un ajuste de configuración, puede hacer que la contraseña de la base de datos sea un ajuste de configuración (junto con la cadena de conexión, el nombre de usuario, etc.)
Historia
Como han mencionado otros, el control de versiones está diseñado para preservar el historial. Por lo tanto, las contraseñas más antiguas aún serán recuperables, lo que puede no ser lo mejor.
Compromiso
¿Cuántas veces hemos visto titulares en las noticias sobre el código fuente de algún producto que se está filtrando al mundo? El código fuente es lo que está en el control de versiones. ¡Esta es probablemente la razón principal para no poner contraseñas en el control de versiones!
However...
Dicho esto, las contraseñas deben almacenarse en algún lugar . Lo que se refiere a las preocupaciones anteriores no es necesariamente que no deban almacenarse en el control de versiones, sino que no deben almacenarse en el repositorio de código fuente del producto en el control de versiones. Tener un repositorio separado para la administración de configuraciones, operaciones, etc. es muy razonable. La clave es dividir las operaciones del desarrollo cuando se trata de credenciales de seguridad, no necesariamente para evitar por completo el control de versiones.
También, para entornos que no son de producción, he almacenado contraseñas y claves de API para sistemas externos en archivos de configuración dentro del código fuente del producto como valores predeterminados. ¿Por qué? Para hacer que sea más fácil cuando un desarrollador revisa el código, puede simplemente compilarlo y ejecutarlo sin tener que ir a buscar archivos de configuración adicionales. Estas son credenciales que rara vez cambian y no conducen a ningún secreto comercial. Pero nunca haría esto con secretos de producción.
Entonces, la conclusión es ... depende.