lunes, 21 de mayo de 2012

Seguridad y permisos en Android

En esta entrada hablaré de como podemos, nosotros como desarrolladores, utilizar las características de seguridad que nos proporciona el sistema operativo Android.



Podemos decir que el sistema operativo Android es un sistema de privilegio-separado, en donde cada aplicación que se pone en ejecución tiene una identidad distinta en el sistema, por ejemplo una ID de usuario y un ID de  grupo, endondes las partes del sistema también están separados en distitans identidades, podemos decir que Linux, como lo vimos en sistemas operativos, lo que hace es aislar las aplicaciones entre si y del sistema.

Para poder proporcionar características de seguridad a una aplicación se pueden declarar un mecanismo de permiso en donde imponemos restricciones a las operaciones específicas de un proceso al igual que permisos por URI para la concesión de elementos específicos de datos.

Arquitectura de seguridad

Un punto central en el diseño de la arquitectura de seguridad de Android es que no hay ninguna aplicación, entonces por defecto, se tienen permisos para realizar cualquier operación que pueda tener un impacto negatico en otras operaciones, o en el sistema operativo en si, inclusive en el usuario, esto incluye el leer o escribir los datos privados del usuario, leer o escribir archivos de otra aplicación, la realización de acceso a la red, manteniendo el dispositivo en modo activo, etc.

 Debido a que las aplicaciones de Android deben hacer de manera explícita el compartimiento de recursos y datos, debemos de declarar que permisos se necesitan para hacer las capacidades adicionales de nuestra aplicación, es importante decir que las aplicaciones, al momento de instalarlas, el sistema le pide el aceptar las condiciones en que esta aplicación va a funcionar, tambien, que Android no tienen ningún mecanismo para dar permisos de forma dinámica en tiempo de ejecución, para no complicar la experiencia del usuario.

Aplicaciones con certificado

Todas las aplicaciones de Android, los archivos .apk, deben de tener "firmado" un certificado cuya clave privada se lleva a cabo por nosotros como desarrolladores, este certificado tiene como finalidad identificar al autor de la aplicación, no tiene que ser firmado por una autoridad de certificación, por lo que es perfectamente facil de realizar y una manera típica de generar certificados para distinguir a los autores de las aplicaciones, permitiendo que el sistema pueda conceder o denegar el acceso a las aplicaciones de permisos a nivel de una firma y conceder o denegar la solicitud de la aplicación para una ID de linux.

ID de usuario y acceso a archivos


Al momento de hacer una instalación de una aplicación de Android, se le da a cada paquete un ID de usuario de Linux distinta, en donde se mantiene constante durante la vida del paquete en ese dispositivo, en un dispositivo que sea diferente, se puede tener el mismo paquete pero con UID diferente, lo que importa es que cada paquete tiene un UID distinto en un determinado dispostivo.

Debido a que la aplicación de seguridad que sucede es en el nivel de proceso, el código de cualquiera de los dos paquetes que normalmente no se pueden ejecutar en el mismo proceso, a que estos necesitan funcionar como diferentes usuarios, esto es similar a lo que pasa en Linux.

Se puede utilizar el atributo sharedUserId en una etiqueta en el AndroidManifest.xm, en donde les asigna el mismo ID de usuario a los dispositivos y permisos en los archivos.

Los datos que podamos almacenar en una aplicación se les asignará la ID de la aplicación, normalmente no son accesibles para otros paquetes, cuando se crea un nuevo archivo, se pueden utilizar banderas como MODE_WORLD_READABLE o MODE_WORLD_WRITEABLE para permitir que cualquer otro paquete puede leer o escribir en el archivo, permitiendo su lectura o escritura global.

Uso de permisos

Una aplicación básica en Android no tiene permisos asociados con ella, lo que significa que no puede puede hacer nada de lo que tendría efectos secundarios en la experiencia del usuario o cualquier otro dato en el dispositivo, para hacer uso de características especiales protegidas por el dispositivo, se debe incluir en sus etiquetas del AndroidManifest.xml uses-permission.

Por ejemplo si se necesita, en mi caso del proyecto de la materia, el uso de internet, se declara de esta manera.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.cantamela" >
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

Así, en el momento de instalar la aplicación, los permisos solicitados por la aplicación se preguntarán en el instalador, no se permite que estos cambien luego de que la aplicación inicia.

Los permisos proporcionados por el sistema Android se pueden encontrar en Manifest.permission, cualquier aplicación puede definir y hacer cumplir sus propios permisos, así que esta no es una lista completa de todos los permisos posibles.

Espero que esta entrada nos ayude a entender como podemos manejar los permisos en Android y como funciona de manera óptima para tener una mejor experiencia al usuario.

1 comentario: