Las instalaciones de red5 y las instalaciones del flash media server vienen con una aplicacion instalada por defecto para permitir a los desarrolladores transmitir video sin necesidad de crear una aplicacion en el servidor rtmp, estas aplicaciones no tienen ningun tipo de restriccion por lo que permiten a cualquier programa y a cualquier server hacer uso del servidor rtmp en cuestion.
En red5 la aplicacion se llama “oflaDemo” y en Flash media server “vod” , estas aplicaciones son un riesgo para el server en el sentido en que cualquiera puede conectarse y hacer uso de la funcionalidad del servidor rtmp, por ejemplo pueden crear sharedObjects , hacer streaming de video en vivo y reproducir videos del server.
Incluso puede crearse un riesgo para el servidor mismo afectando todas las otras aplicaciones(apache, iis , pop, etc..) instaladas en el servidor porque si alguien crea un swf que inunde de conecciones al servidor rtmp saturara el sistema y la memoria impidiendo a otros programas funcionar algo parecido a un DoS (denial of service).
La solucion es borrar la aplicacione oflaDemo o vod o modificarlas para agregarles algun tipo de autenticacion.
En red5 yo verifico desde que dominio un usuario se esta conectando esto es posible usando la informacion que un swf envia al servidor rtmp al crear una coneccion , entre estos datos esta “pageUrl” que tiene un valor similar a “http://dominio/peli.swf” entonces en mi clase applicationAdapter uso este codigo :
public boolean connect(IConnection conn, IScope scope, Object[] params) {
if ( !runsFromMyDomain (conn) ) {
rejectClient(“red5 error : violacion de seguridad hotlinking flv”);
}
if (!super.connect(conn, scope, params)) {Â Â Â return false;Â }
return true;
}
/**
* Revisa si el swf esta siendo ejecutado desde mi dominio
*/
private boolean runsFromMyDomain (IConnection conn){
Map <String,Object> swfParams = conn.getConnectParams();
Iterator          iterator = swfParams.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry obj = (Map.Entry)iterator.next();
if(obj.getKey().toString().equals(“pageUrl”)){
String pageUrl = obj.getValue().toString();
if( pageUrl.indexOf(“http://miDominio.com”) == 0 ){Â Â Â return true;Â Â Â Â Â Â }
if( pageUrl.indexOf(“http://www.miDominio.com”) == 0 ){Â Â Â return true;Â Â Â Â Â Â }
}
}
return false;
}
Este codigo revisa la coneccion recien creada y busca en sus parametros la variable pageUrl para verificar que el swf o app esta siendo ejecutada desde mi dominio y no desde algun otro sitio, esto impide que extraños utilicen mi servidor rtmp e incluso que alguien intente descargar uno de mis swf y ejecutarlo localmente.
En flash media server el codigo debe ser muy similar pero no cuento con un server para hacer pruebas.
La ventaja de mi codigo es que no requiere de autenticacion de usuarios y tampoco requiere de rtmps para evitar que alguien utilice un sniffer para encontrar el usuario y pass o los parametros especiales para la coneccion a rtmp.
Otro problema con red5 es que la pagina de inicio es visible por defecto entrando en http://dominio:5080 y generalmente sin seguridad alguna permitiendo a un extraño instalar la aplicacion oflaDemo u otras de los ejemplos , creo que incluso entrar a la admin si conoce el password que viene por defecto, de este problema hablare en otro post y como descubrir hosts con este problema
ACTUALIZACION :
En las listas de red5 me comentaron que tambien es posible proteger las aplicaciones usando configuraciones definidas en los xml de las webapps, aqui esta la info :
http://www.red5.org/wiki/Examples/SecurityExample